X Millionen Strings zuordnen

Kademlia

Grünschnabel
Hey,

ich bin gerade dabei eine Textdatei mit etwa 1,1 Millionen Strings zu ordnen.

Da das ganze per Quicksort extrem lange dauert wollte ich mit mehrdimensionalen Listen arbeiten.

Die 17 steht für die Stringlänge
Die 36 steht für alphanumeric (a-z 0-9)

List<String>[][] lists = new List[17][36];

Allerdings bekomme ich beim einfügen in die Listen eine NullPointerException und weiß nicht warum. Ich meine das der Fehler schon in der genannten Zeile des Programms liegt. Bin mir aber nicht sicher. Daher hier nochmal der komplette Code.

Code:
import org.apache.commons.lang.time.StopWatch;
import java.io.*;
import java.util.*;

public class NameListGen {
	
	public static void main(String[] args) throws Exception {
		File file = new File("newfile.txt");
		BufferedReader br = new BufferedReader(new FileReader(file));
		
		StopWatch stopWatch = new StopWatch();
		stopWatch.start();
		
		List<String>[][] lists = new List[17][36];
		String line = null;
		int totalLinesProcessed = 0;
		int comparedLines 		= 0;

		while ((line = br.readLine()) != null) {
			totalLinesProcessed++;
			int length = line.length();
			char firstchar = line.charAt(0);
			if (line.charAt(0) < 58){
				 firstchar -= 48;
			}
			else if (line.charAt(0) < 91){
				firstchar -= 65;
			}
			else if (line.charAt(0) < 123){
				firstchar -= 97;
			}
			System.out.println((int)firstchar);
			System.out.println(length-3 + " (real:" + length + ")");
			System.out.println(line);
			lists[length-3][5].add(line);
		}
		for (int i = 0; i < 17; i++) {
			for (int j = 0; j < 36;j++){
				PrintStream ps = new PrintStream(new FileOutputStream("C:\\Youtube\\Count" + i + "Char" + j ));
				ps.println(lists[i][j].toString());
			}
		}

		stopWatch.stop();

		br.close();

		System.out.println("Total lines processed = " + totalLinesProcessed
				+ " Lines copied = "+ comparedLines + " Time taken = " + stopWatch.getTime() + " ms");
	}
}

Hoffe es jat jemand rat.

Falls jemand eine Idee für ein schnelleres sortierverfahren hat - nur zu :) - nur nicht zu schwer stecke noch in den Startlöchern.

Edit: Hier wird noch nicht sortiert, nicht wundern. Die Textdatei am anfang ist nur zum Testen. Später kommen durchweg neue Einträge.
 
Zuletzt bearbeitet:
Allerdings bekomme ich beim einfügen in die Listen eine NullPointerException und weiß nicht warum.
Wäre toll zu wissen in welcher Zeile die NullPointerException auftritt...
Code:
List<String>[][] lists = new ArrayList[17][36];
...
lists[length-3][5].add(line);
Das wäre für mich schonmal ein Kandidat für den Fehler. Die ArrayList enthält ja noch keine Elemente, ist also an jeder Position null. VIELLEICHT (ist nur geraten) kommt er an dieser Stelle mit dem add nicht klar und du müsstest stattdessen
Code:
lists[length-3][5]=new ArrayList <String>();
lists[length-3][5].add(line);
machen. Aber halt auch nur wenn die NullPointerException zufällig in der Zeile ist.


Zum Sortieren ... ob's schneller als deine Methode ist kann ich nicht sagen, aber du kannst dir das Leben auf jeden Fall ein ganzes Stück einfacher machen, wenn du dir mal Collections.sort anschaust :-)
 
Zuletzt bearbeitet:
Zurück