2009-12-05 3 views
1

Это не общий вопрос о чтении или записи. Я написал программу на 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-класс, и мы его не покрыли, но его отличная функция и спасибо за то, что ознакомили меня с этим!

+0

RE: редактирует ,Обратите внимание, что вы также можете полностью вырезать массив строк, используя 'TreeSet' вместо' HashSet' - вы можете перебирать 'Set' (или любой' Iterable') с помощью 'for (String line: lines) {'. Для этого вам нужно использовать объявление generics: 'Set lines = new TreeSet ();' – McDowell

ответ

1

Если вы добавите строки в набор (в качестве ключей), а не в массив, вы обнаружите, что вам не нужно выполнять дублирующую обработку. Это позаботится о вас, и ваша программа будет проще и короче.

0

На самом деле ваш код нуждается в некоторых улучшениях, , но то, что приходит ко мне, самое неправильное - это сделать сравнение с не обрезанной строкой, а затем поместить его в массив строк, используя обрезанную строку выделенной строки.

lines[i].equals(strLine) // instead use "lines[i].equals(strLine.trim())" 
1

Массивы не являются структурами данных, которые вы хотите здесь (вам нужна структура данных с фиксированной длиной и упорядоченностью, но с изменяемыми элементами?). Посмотрите на типы коллекций в java.util. В частности, посмотрите на версии SortedSet, такие как TreeSet. Это будет:

  1. Expand для хранения данных
  2. Устранение дубликатов (это Set)
  3. Сортировать его содержимое по мере их добавления (см Comparator реализации как String.CASE_INSENSITIVE_ORDER)