Bitte um Rat: Sortieren mit ArrayList

Status
Nicht offen für weitere Antworten.

engelchen194

Mitglied
Hallo zusammen!

Folgende Thematik:

Ich lese einen Logfile zeilenweise ein.
Dieser ist in bestimmte Abschnitte aufgeteilt, welche durch eine "ID(..)" gekennzeichnet sind, die je Abschnitt gleich ist.
Ist in einem solchen Abschnitt das Wort [checkConnection], soll der gesamte Abschnitt automatisch gelöscht werden.
Der Rest wird in eine neue Datei geladen. Habe auch ein Beispiel des LogFiles angefügt.
Dies habe ich auch soweit schon umgesetzt und es funktioniert. Habe dies mit einer ArrayList gelöst,
die, solange die ID´s die gleiche Zahl haben wird weiter zeilenweise eingelesen. Sobald eine neue Zahl kommt, wird die Liste (die
Zeile für Zeile beladen wird)

- entweder ganz gelöscht (wenn checkConnection vorkommt)
- oder in die neue Datei geschoben

Dann wird sie wieder neu beladen usw.

Nun ist der Haken bei der Sache, dass die ID´s teilweise durcheinander sind und sich ein bis zwei Zeilen eines Abschnittes
davor oder danach in einer Sequenz einschleichen. Siehe Beispiel unten.

Dies soll nun so sortiert werden, dass die Zeile, die nicht zum jeweiligen Abschnitt gehört, in den Abschnitt oben bzw. unten eingefügt
wird. --> hier ID(17), soll nach oben zu restlichen ID(17) geschoben werden.

Daher soll die Liste nicht nach jedem Abschnitt gelöscht werden, sondern bestehen bleiben, damit eventuell etwas verschoben werden kann.

LOGFILE-AUSZUG:
Code:
hh:mm:ss:ms ()				ID(17): >>BCD: 

ABC
hh:mm:ss:ms () 				ID(16): >>------------------------------------------------------------<< ABC

hh:mm:ss:ms () 				ID(16): >>ABC

hh:mm:ss:ms () 				ID(16): >>ABC

hh:mm:ss:ms() 				ID(16): >>AttributeNames: 

AB
hh:mm:ss:ms () 				ID(16): >>ParameterNames: 
	
ABC
hh:mm:ss:ms () 				ID(16): >>a[checkConnection] wird nicht n?her untersucht.<< ABC

hh:mm:ss:ms() 				ID(16): >>BCD 

<< ABC	
hh:mm:ss:ms() 				ID(16): >>ABC

hh:mm:ss:ms() 				ID(16): >>1<< ABC

hh:mm:ss:ms () 				ID(17): >>ABC

hh:mm:ss:ms () 				ID(17): >><html><head><title>abc</title></head><body>

hh:mm:ss:ms() 				ID(20): >>------------------------------------------------------------<<

UND HIER NOCH MEIN BISHERIGER CODE:
Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.BufferedWriter;
import java.util.ArrayList;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import org.xml.*;


public class CheckConn2_1 {

	public static void main(String[] args){

		File outFile = new File(C://Zielpfad_neu.out");



		String alt_ID = "";
		String neu_ID = "";
		StringBuffer zeile = null;
		int i = 0;

		boolean connection = false;

		BufferedReader reader;
		BufferedWriter bw;
		PrintWriter pw;



//		Einlesen der Datei und festlegen der Ausgabedatei
		try{
			FileInputStream fs = new FileInputStream("C://Quellpfad.log");
			reader = new BufferedReader(new InputStreamReader (fs));

			bw = new BufferedWriter(new FileWriter(outFile, false));
			pw = new PrintWriter(bw);

//			Erzeugen einer ArrayList für das Ablegen der Zeilen mit gleicher ID
			ArrayList<StringBuffer> idList_1 =new ArrayList<StringBuffer>();

			
			// XXX Liste, die alle Sektionen hält
			ArrayList<ArrayList<StringBuffer>> sectionList = new ArrayList<ArrayList<StringBuffer>>();


			while(true){ 
				String tmp;
				if( (tmp = reader.readLine()) != null )
					zeile=new StringBuffer( tmp );	//zeilenweises einlesen
				else zeile = null;
				
				i++;


				if(zeile==null){				//..bis zur letzten Zeile


					if(connection==false){


						for(int z=0; z < idList_1.size(); z++) {
							pw.println(idList_1.get(z));
						}

					}

					break;
				}

//			wenn die Zeile checkConnection enthält, setze connection auf true damit nicht rausgeschrieben wird

				if(zeile.toString().contains("[checkConnection]")){

					connection=true;
				}

//			suche nach Textstelle "ID()"				
				
				if(zeile.toString().contains("ID(")){

					System.out.println(zeile.substring(42,44));
					neu_ID = zeile.substring(42, 44); //schneidet die Zeile, bis auf die Position der Zahlen aus
					if(i==1){
						alt_ID=neu_ID;
					}


					if(!alt_ID.equals(neu_ID)){

						alt_ID=neu_ID;	//wenn die alte ID nicht der neuen gleicht, setze alt_ID auf neu_ID


						if(connection==false){

							for(int z=0; z < idList_1.size(); z++) {	//Zeile um eins erhöhen
								pw.println(idList_1.get(z));
							}

						}else{
							idList_1.clear();
							connection=false;
						}
						sectionList.add( new ArrayList<StringBuffer>( idList_1 ));
						
						

					}else{

						idList_1.add(zeile);

					}

				}else{

					idList_1.add(zeile);
				}
				
	//Ideen			
				
				// wenn gesammelte Zeilen != checkConnection, dann
				// sectionList.add( new ArrayList<StringBuffer>( idList_1 ));
				// sonst, idList.clear() und fahre fort mit den weiteren neuen Zeilen bzw. oben


				
			}
			bw.close();


		}catch (IOException ex){
			ex.getMessage();
		}
	}
	
	
}

Wie würdet ihr das am besten sortieren?
Vielen Dank schon mal für eure Tipps!!
 
Höm. Klingt irgendwie kompliziert. Ohne den Code komplett nachvollzogen zu haben: Du liest ja schon die ID aus. Kannst du nicht alles, was zu einer ID gehört, in einen String (oder meinetwegen zeilenweise in eine ArrayList) speichern, und auf diese Strings/Lists dann mit einer Map zugreifen? Pseudocode
Code:
Map<Integer, List<String>> map = new ...
List<Integer> idsToRemove ...
for (alle Zeilen)
{
    int id = liesID();
    List<String> list = map.get(id);
    if (list == null)
    {
        list = new ArrayList<String>();
        map.put(id, list);
    }
    list.add(eingeleseneZeile);
    if (eingeleseneZeile.contains(diesesCheckDingensDa)) idsToRemove.add(id);
}
for (alle idsToRemove) map.remove(id);
Wenn man dafür eine TreeMap verwendet, ist das ganze dann prakticherweise auch aufsteigend nach IDs sortiert ... und irgendwie hatte deine Frage ja - zumindest dem Betreff nach - was mit "sortieren" zu tun....
 
Hmm.. das wäre eine Möglichkeit...
Es kommt halt nicht jede ID nur einmal vor. Es gibt ziemlich viele die sich wiederholen. Aber ich probier es mal!
Danke!

Was sagst du, besser erst den File einmal komplett einlesen und dann "verarbeiten"(ID ausschneiden, löschen etc.) oder gleich beides in einem Aufwasch??

Grüße
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben