OOP Treemap Problem

Existenzhass

Mitglied
Hallo zusmmen, ich habe ein kleines Problem bei der Treemap. Ich bin nicht besonders gut im Programmierungsbereich und das möchte ich auch dringend ändern. Hoffentlich treffe ich hier in diesen Forum auf paar Hinweise, die mir weiter helfen werden. Mein Problem sieht folgendes aus. Ich muss eine Logfile zeilenweise einlesen und nach IP adressen durchsuchen. Dann, sollte es ausgewertet sein, welche IP welche Dateiein angefordert haben. Soweit kriege ich es hin die Datei durchzusuchen und eine Treemap zu erstellen, doch weiter wird in der Treemap nichts abgelegt. Hier stelle ich mein Sourcecode rein.


Java:
	public void IpDatei () throws java.text.ParseException {


		Map<String, String> analysis = new TreeMap<String, String>();

		try {
			BufferedReader br = new BufferedReader(new FileReader(new File("apache.log")));//apache log einlesen
			String line = null;
			while ((line=br.readLine())!=null){
				String[] ipKey 	= line.split(" ");//splitt: " "

				String ip		= ipKey[0];
				String file		= ipKey[6];
				
				if(analysis.containsKey(ip)){
						
						
						file = analysis.get(ip);
						analysis.put(ip, file);	
				
				}
				System.out.println(analysis);
			}

		} catch (FileNotFoundException e) {
			System.err.println("Datei konnte nicht gefunden werden!");
			e.printStackTrace();
		} catch (IOException e) {
			System.err.println("Fehler beim Einlesen!");
			e.printStackTrace();
		}

	}

Vielen Dank erst mal!
 
Zuletzt bearbeitet:

ARadauer

Top Contributor
ja... wenn es drinnen ist fügst du es ein...

Java:
if(analysis.containsKey(ip)){
                        
                        
                        file = analysis.get(ip);
                        analysis.put(ip, file); 
                
                }
und wenn nicht?

Also du willst im Grunde eine Liste aus der Map bekommen oder?

Schau dir das mal an

Java:
Map<String, List<String>> analysis = new TreeMap<String, List<String>>();
        ....
        String ip       =null;
        String file     = null;
        ....
        List<String> files = analysis.get(ip); //liste für die ip
        if(files == null){ //gibt es nicht, dann erzeugen und einfügen
            files = new ArrayList<String>();
            analysis.put(ip, files);
        }
        files.add(file);
 
Zuletzt bearbeitet:

Existenzhass

Mitglied
Danke, es hat super geholfen, ich befürchte nur, dass ich das mit den Maps nicht ganz so drauf habe. Und zwar, bei der Nächsten Map habe ich schon wieder ein Problem. Und zwar:

Java:
	public void MostPopularFile(){
		ParseLog pl = new ParseLog();

		Map<String, Integer> popularity = new TreeMap<String, Integer>();//TreeMap anlegen


		for(LogEntry entry : pl.logEntryList){
			if(!popularity.containsKey(entry)){//Wenn key nicht vorhanden
				popularFile = logc.getFile();//eine Datei holen und ins popularFile ablegen
		        	counter = 1;//zähler auf 1 setzen
 				popularity.put(popfile, counter);
			}else
				counter++;//zähler um 1 erhöhen
		}//for(LogEntry entry : pl.logEntryList)
		System.out.println(popularity);//map ausgeben		
	}

LogEntry ist ein Interface, den ich implementieren soll. LogEntryList ist ein Objekt, der die LogEntrys beinhaltet. Ich habe eine Klasse erstellt, die die LogEntrys implementiert und die Klasse beinhaltet eine Liste mit Logentrys (von einer Textdatei) "LogEntryList". Ich soll mit einer Map die LogEntryList durchsuchen und davon die angeforderten Dateien rausholen (mit der get Methode: getFile() ). Übrigens ich habe davon noch nie gehört, dass man Interface so durchsuchen kann. Es geht hier um eine Statistik jeder angeforderten Datei, wie oft sie angefordert wurde. Ich hoffe, ihr habt ein bisschen mehr Überblick als ich.
 

ARadauer

Top Contributor
counter = 1;//zähler auf 1 setzen
welchen? hast du den vorher irgendwo definiert?

Zeile 11: popularity.put(popfile, 1);
Zeile 13: popularity.put(popfile, popularity.get(popfile)+1);
 

Existenzhass

Mitglied
-> Zähler

Einen Zähler habe ich vorher definiert, das soll der counter sein. Der ist auf null gesetzt und sobald eine Datei herausgeholt wird, soll der counter auf 1 gesetzt sein. Wenn die Datei schon vorhanden ist, soll es nur um 1 erhöht werden. Ich glaube übrigens, dass es bei mir das mit LogEntrys durchsuchen nicht klappt, weil die ausgabe, die das Programm liefert lautet nur " {} ". Das Problem ist, dass wir die Maps nicht vernünftig erklärt haben und keiner so wirklich damit klar kommt. Ich glaube, dass das Problem sich irgendwo hier befindet:
Java:
for(LogEntry entry : pl.logEntryList){
			if(!popularity.containsKey(entry)){
				popfile = logc.getFile();
				counter = 1;
				popularity.put(popfile, 1);
			}else
 

Oben