Это не общий вопрос о чтении или записи. Я написал программу на Java, чтобы читать в текстовом файле некоторые метаданные из изображений. Они содержат имена и длинный список из них иногда более 4000 имен. К сожалению, многие из этих имен одинаковы, поэтому я написал программу, которая переводит список в файл .txt и избавляется от дубликатов и выводит новый очищенный и отсортированный по алфавиту список в выходной файл txt. Кроме того, программа добавляет теги списка html к каждому имени, чтобы я мог скопировать их в любом месте.Чтение и письмо в программе Java Вопрос
Пример текстового файла
Chatty Маленькая Китти
Chatty Маленькая Китти
Bearly Нуф Таз
Got Lil Pepto
и т.д. и т.п.
Вы можете увидеть один я использую чтобы проверить здесь http://www.megaupload.com/?d=WNXYVHEN
Однако, похоже, что это не работает должным образом y, поскольку у меня все еще есть дубликаты в моем выходном файле. Однако код, который я написал, мне кажется правильным, поэтому я спрашиваю, есть ли проблема с тем, как я настраиваю свои чтения и записи.
Мой код
/* * This program takes in a text file that has a bunch of words listed. It then creates a single alphabetically * organized html list from that data. It also strips the data of dupblicates. */
import java.io.*; import java.util.Arrays;
public class readItWriteIt {
public static void main(String args[]) { int MAX = 10000; String[] lines = new String[MAX]; boolean valid = true;
try{
//Set up Input
FileInputStream fstream = new FileInputStream("test.txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
//Set up Output
FileWriter ostream = new FileWriter("out.txt");
BufferedWriter out = new BufferedWriter(ostream);
//counters
int count = 0;
int second_count = 0;
//start reading in lines from the file
while ((strLine = br.readLine()) != null){
//check to make sure that there aren't duplicates. If a line is the same as another line
//set boolean valid to false else set to true.
if((second_count++ > 0) && (count > 0)){
for(int i=0; i < count; i++)
{
if(lines[i].equals(strLine)){
valid = false;
}
else
{
valid = true;
}
}
}
//only copy the line to the local array if it is not a duplicate. Else do nothing with it.
if (valid == true){
lines[count] = strLine.trim();
count++;
}
else{}
second_count++;
}
//create a second array so that you can get rid of all the null values. It is the size of the
//used length in the first array called "lines"
String[] newlines = new String[count];
//copy data from array lines to array called newlines
for(int i = 0; i < count; i++){
newlines[i] = lines[i];
}
//sort the array alphabetically
Arrays.sort(newlines);
//write it out to file in alphabetical order along with the list syntax for html
for(int i = 0; i < count; i++)
{
out.write("<li>" + newlines[i] + "</li>");
out.newLine();
}
//close I/O
in.close();
out.close();
}catch (Exception e){//Catch exception if any
System.err.println("Error: " + e.getMessage());
}
}
}
Я надеялся, что кто-то может помочь мне. Большое спасибо! :)
Эй, ребята, спасибо за предложения и помощь. я написал как этот
import java.util.HashSet; import java.util.Set; import java.io.*; import java.util.Arrays;
public class converter { public static void main(String[] args) {
try{
//Set up Input
FileInputStream fstream = new FileInputStream("test.txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
//Set up Output
FileWriter ostream = new FileWriter("out.txt");
BufferedWriter out = new BufferedWriter(ostream);
Set lines = new HashSet();
boolean result;
while ((strLine = br.readLine()) != null){
result = lines.add(strLine.trim());
}
String[] newlines = new String[lines.size()];
lines.toArray(newlines);
Arrays.sort(newlines);
//write it out to file in alphabetical order along with the list syntax for html
for(int i = 0; i < lines.size(); i++)
{
out.write("<li>" + newlines[i] + "</li>");
out.newLine();
}
out.close();
in.close();
}catch (Exception e){//Catch exception if any
System.err.println("Error: " + e.getMessage());
}
}
}
, но благодаря ewernli его теперь гораздо более эффективным. Я не знал о наборах, поскольку я только что взял свой первый Java-класс, и мы его не покрыли, но его отличная функция и спасибо за то, что ознакомили меня с этим!
RE: редактирует ,Обратите внимание, что вы также можете полностью вырезать массив строк, используя 'TreeSet' вместо' HashSet' - вы можете перебирать 'Set' (или любой' Iterable') с помощью 'for (String line: lines) {'. Для этого вам нужно использовать объявление generics: 'Set lines = new TreeSet ();' –
McDowell