Textfile mit StringTokenizer einlesen und sortiert ausgeben

  • Themenstarter Themenstarter Gelöschtes Mitglied 37019
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 37019

Gast
Hallo,

ich möchte gerne eine Textdatei (.txt) einlesen mit dem StringTokenizer in einzelne Tokens zerlegen diese dann in ein Array packen, sortieren, und ausgeben.

Das einlesen funktioniert wunderbar, auch das zerlegen. Aber das speichern in ein Array und das sortieren mittels Arrays.sort (mit Hilfe von "import java.util.Arrays;") macht mir noch Probleme glaube ich.

Eclipse meldet mir keine Fehler aber wenn ich mein Programm über die Konsole aufrufe, dann gibt es folgende fehlermeldung:

Code:
Exception in thread "main" java.lang.NullPointerException
at java.util.ComparableTimSort.countRunAndMakeAscending<Unknown Source>
at java.util.ComparableTimSort.sort<Unknown Source>
at java.util.ComparableTimSort.sort<Unknown Source>
at java.util.Arrays.sort<Unknown Source>
at tokenindex.main<tokenindex.java:26>

Hier mein Java-Code:

Java:
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

	
public class tokenindex2 {
	
	public static void main(String[] args) throws Exception {	
	
	if(nM(args)){																					
		File d1 = new File(args[0]);																		
																	
			String entryLyrics = leL(d1);													
			System.out.println(entryLyrics);
							
			StringTokenizer d2 = new StringTokenizer(entryLyrics, " ");
			String [] d2Array = new String[d2.countTokens()];
			
			for(int i=1;i<=d2Array.length;i++){
				d2Array[d2Array.length-1]=d2.nextToken();
				
			
			Arrays.sort(d2Array);
				for (int j = 0; j < d2Array.length; j++) {
					System.out.println(d2Array[j]);
					}
				}
			}
			
				
	}

}

ich hab mal die einlese-methode und check-methode rausgelassen, da diese funktionieren 😉

Ich wäre sehr hilfreich für Tipps und Anregungen.

Vielen Dank :toll:
 
Du weist hier immer auf die gleiche "Zelle" im Array

Java:
for(int i=1;i<=d2Array.length;i++){
    d2Array[d2Array.length-1]=d2.nextToken();
}


Java:
for(int i=1;i<d2Array.length;i++){
    d2Array[i]=d2.nextToken();
}

sollte dir mehr erfolg bringen
 
Danke für den Tipp, das war blöd von mir^^.

aber leider bleibt die selbe Fehlermeldung bestehen...???:L
 
Java:
for(int i=1;i<=d2Array.length;i++){
                d2Array[d2Array.length-1]=d2.nextToken();
                
            
            Arrays.sort(d2Array);
                for (int j = 0; j < d2Array.length; j++) {
                    System.out.println(d2Array[j]);
                    }
                }
            }


die 2. schleife ist in der erste. Du versuchst dort alle Zellen auszugeben von 0 bis länge des arrays.

Das wird aber nicht klappen solange sie nicht alle einen Inhalt haben.


Versuch also einfach mal
Java:
 for (int j = 0; j <= i; j++) {
                    System.out.println(d2Array[j]);
                    }


Dann geht er immer nur bis zur aktuell gefüllten Zeile 😉
 
Auch bei einem leeren String Array gibts Ausgaben ohne Exception -> "null".

Läuft alles, wenn du die Zeile mit Sort auskommentierst? Dein Problem ist, dass das Array nicht komplett gefüllt ist und du trotzdem versuchst es zu sortieren. Fülle als erstes das Array komplett und sortiere dann.
 
Zuletzt bearbeitet:
Warum fängt i bei 1 an? Hat das einen Grund? 0 basiert macht es das ganze einfacher:

Java:
for(int i=0;i<d2Array.length;i++){
                d2Array[i]=d2.nextToken();
 
Läuft alles, wenn du die Zeile mit Sort auskommentierst? Dein Problem ist, dass das Array nicht komplett gefüllt ist und du trotzdem versuchst es zu sortieren. Fülle als erstes das Array komplett und sortiere dann.

Habs mal auskommentiert und es funktioniert soweit bis auf das ich folgendes am ende bekomme:


Code:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 12 at tokenindex.main <tokenindex.java:29>

das hab ich jetzt aber beheben können, da ich die for-schleifen mit anfang 0 jeweils und ende array.length -1 angegeben habe.

somit bleibt nur noch der Fehler mit dem Arrays.sort(d2Array)

hier mein soweit verbesserter Code:

Java:
	public static void main(String[] args) throws Exception {	
	
	if(nM(args)){																					
		File d1 = new File(args[0]);																		
																	
			String entryLyrics = leL(d1);													
			System.out.println(eL);
							
			StringTokenizer d2 = new StringTokenizer(eL, " ");
			String [] d2Array = new String[d2.countTokens()];
			
			for(int i=0;i<d2Array.length - 1;i++){
			    d2Array[i]=d2.nextToken();
			}
				
			
			Arrays.sort(data2Array);
			 
			
			
			for (int j = 0; j <= d2Array.length -1; j++) {
                 System.out.println(d2Array[j]);
                 }
					}
				}
 
Hier mal mein meine fast fertige Lösung:

Java:
import java.io.*;
import java.util.*;
import java.util.regex.Pattern;

public class TokenIndex_Exercixe1 {																				//defines public class called "TokenIndex"
	
																												
				
public static void main(String[] args) throws Exception {														//defines main-method which throws Exception
				
	if(noMisentry(args)){																						//checks by noMisentry-method if input in console is correct	
		File data1 = new File(args[0]);																			//loads File from args[0]
					
		@SuppressWarnings("resource")
		BufferedReader inputReader = new BufferedReader (new InputStreamReader(new FileInputStream(data1)));	//loads text from file into main-method
					
		String data2 = "";																						//defines helpstring
		String data3 = "";																						//defines helpstring
									
					
		while (inputReader.ready() == true) {																	//while-loop to fill helpstring
			data2 = inputReader.readLine();																		//reading lines of textfilen into data2
			    
		System.out.println("Your loaded Text: ");																//displaying "your laoded Text: "
		System.out.println("\n");																				//displaying blankline
		System.out.println("\"" + data2 + "\"");																//displaying loaded Text in original
		System.out.println("\n");																				//displaying blankline
	   	System.out.println("Splitting text and display token in alphabetically order!");						//displaying "Splitting text and display token in alphabetically order!"
	   	System.out.println("\n");																				//displaying blankline
		System.out.println("Splitting completed: ");															//displaying "Splitting completed: "
		System.out.println("\n");																				//displaying blankline

			            
		StringTokenizer sortingOutDelimiter = new StringTokenizer(data2,",.!?/()[]\\;:\"§$%&=");				//using StringTokenizer to sort out delimiters from text
			            
			while(sortingOutDelimiter.hasMoreTokens()== true) {													//while-loop to load several tokens in stringhelper data3
			    data3 = data3 + sortingOutDelimiter.nextElement()+ "";							
			}
			           
		}
			       		
		String sortWords = data3;																				//defines sortWords to sort tokens
		String[] inputAsArray = sortWords.split(Pattern.quote(" ")); 											//delete blanks and convert character-string to array
			            
		List<String> inputAsList = Arrays.asList(inputAsArray); 												//fill Array-content in a List called inputAsList
		Collections.sort(inputAsList);																			//Sorting List in alphabetically-order by collections.sort-function
	
		
		
		for(int i=0;i < inputAsArray.length;i++) {																//for-loop to sort list for each token
			System.out.println(inputAsList.get(i));																//displaying tokens in alphabetically correct order
		}
	}
}
				

/*
if (inList(list,word)){
	list.add(word);
	}

public static boolean inList(List<E> list, String pWrd){
	int i = list.size();
	
	for(int j = 0; j <-(i-1); j++){
		String str1 = new String((String) list.get(j));
		String str2 = pWord;
		if(str1.equals(str2)){
			return false;
		
		}
	}
}
*/

				
public static boolean noMisentry(String [] args){															 	//defines public class noMisentry to check if input in console ist correct
					
	if(args.length == 1){																						//if-statement to check if 1 parameter is given
		return true;																							//returning "true" to main-method
	}
		
	else {																										//else-statemtent if input isn't correct
		System.out.println("Input isn´t working! Please input 1 parameters with fontcode. Thank You!");			//displaying help, caused by incorrect input in console
		return false;																							//returning false to main-method, so that main method is not starting											
						
		}																								
					
	}	

}

funktioniert soweit einwandfrei.. jedoch habe ich es nicht hinbekommen wörter die mehrmals im text vorkommen nur einmal auszugeben.. ich hatte versucht dafür eine methode zu schreiben, die hier "inList" heißt und auskommentiert ist. Hat jmd. eine ahnung wie ich das noch machen könnte?

Danke

Gruß Lostmaster
 
Ein Set erlaubt keine Duplikate. Also füge doch Deine Strings einem Set zu und sortiere dies.
Java:
		String[] inputAsArray = new String[] { "hugo", "Datensatz-1",
				"Datensatz-2", "hugo" };
		Set<String> inputSet = new HashSet<String>();
		for (String string : inputAsArray) {
			inputSet.add(string);
		}
		String[] array = inputSet.toArray(new String[0]);
		List<String> inputAsList = Arrays.asList(array);
		Collections.sort(inputAsList);
		for (String string : inputAsList) {
			System.out.println(string);
		}
	}
 

Zurück
Oben