I am trying to split a dictionary file that I have into multiple dictionaries of different lengths, for example if I want take it and put it into smaller dictionaries of length 2, 3, 4, ..... n, where I can then search them quicker. When I say quicker I mean that I will know the input length and therefore accessing the corresponding length dictionary (a fraction of the whole) will mean quicker accesses. This is my current implementation that generates the files but doesn't write to them like I desire. Ideally, all words of length 2 for example will be written into the length2 text file. Anyone have any suggestions?
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.PrintWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("dictionary.txt");
PrintWriter l2 = new PrintWriter("dictionary_length2.txt", "UTF-8");
PrintWriter l3 = new PrintWriter("dictionary_length3.txt", "UTF-8");
PrintWriter l4 = new PrintWriter("dictionary_length4.txt", "UTF-8");
PrintWriter l5 = new PrintWriter("dictionary_length5.txt", "UTF-8");
PrintWriter l6 = new PrintWriter("dictionary_length6.txt", "UTF-8");
PrintWriter l7 = new PrintWriter("dictionary_length7.txt", "UTF-8");
PrintWriter l8 = new PrintWriter("dictionary_length8.txt", "UTF-8");
PrintWriter l9 = new PrintWriter("dictionary_length9.txt", "UTF-8");
PrintWriter l10 = new PrintWriter("dictionary_length10.txt", "UTF-8");
PrintWriter l11 = new PrintWriter("dictionary_lengty11.txt", "UTF-8");
PrintWriter l12 = new PrintWriter("dictionary_length12.txt", "UTF-8");
PrintWriter l13 = new PrintWriter("dictionary_length13.txt", "UTF-8");
PrintWriter l14 = new PrintWriter("dictionary_length14.txt", "UTF-8");
PrintWriter l15 = new PrintWriter("dictionary_length15.txt", "UTF-8");
PrintWriter l16 = new PrintWriter("dictionary_length16.txt", "UTF-8");
PrintWriter l17 = new PrintWriter("dictionary_length17.txt", "UTF-8");
PrintWriter l18 = new PrintWriter("dictionary_length18.txt", "UTF-8");
PrintWriter l19 = new PrintWriter("dictionary_length19.txt", "UTF-8");
PrintWriter l20 = new PrintWriter("dictionary_length20.txt", "UTF-8");
PrintWriter l21 = new PrintWriter("dictionary_length21.txt", "UTF-8");
BufferedReader tr = new BufferedReader(fr);
String temp;
int temp_length;
for(int i = 0; i < 60388; i++){
temp = new String(tr.readLine());
temp_length = temp.length();
if(temp_length == 2)
l2.println(temp);
if(temp_length == 3)
l3.println(temp);
if(temp_length == 4)
l4.println(temp);
if(temp_length == 5)
l5.println(temp);
if(temp_length == 6)
l6.println(temp);
if(temp_length == 7)
l7.println(temp);
if(temp_length == 8)
l8.println(temp);
if(temp_length == 9)
l9.println(temp);
if(temp_length == 10)
l10.println(temp);
if(temp_length == 11)
l11.println(temp);
if(temp_length == 12)
l12.println(temp);
if(temp_length == 13)
l13.println(temp);
if(temp_length == 14)
l14.println(temp);
if(temp_length == 15)
l15.println(temp);
if(temp_length == 16)
l16.println(temp);
if(temp_length == 17)
l17.println(temp);
if(temp_length == 18)
l18.println(temp);
if(temp_length == 19)
l19.println(temp);
if(temp_length == 20)
l20.println(temp);
if(temp_length == 21)
l21.println(temp);
}
tr.close();
l2.close();
l3.close();
l4.close();
l5.close();
l6.close();
l7.close();
l8.close();
l9.close();
l10.close();
l11.close();
l12.close();
l13.close();
l14.close();
l15.close();
l16.close();
l17.close();
l18.close();
l19.close();
l20.close();
l21.close();
System.out.println("Complete.");
}
}
解决方案
Tangental "answer" follows. (This should also print out contents to the files, unless I'm missing something very basic.)
Whenever there is a set of variables in the form xN (e.g. l2, l3, l22), they should usually be replaced with a List collection type such as an ArrayList.
This is just an example to show how can be reduce duplication and fixed bounds:
int MAX_WORD_LEN = 22; // making this dynamic left as an excercise
List writers = new ArrayList();
for (int i = 0; i <= MAX_WORD_LEN; i++) {
PrintWriter w = new PrintWriter("dictionary_length" + i + ".txt", "UTF-8");
writers.Add(w);
}
String line;
while ((line = tr.readLine()) != null) {
int len = line.length();
if (len < writers.size()) {
writers.get(len).println(line);
}
}
for (PrintWriter w : writers) {
w.close();
}
Slight adjustments can be made to not create a "0" or "1" file.