从arraylist <object>中删除重复的字符串

时间:2016-03-22 13:26:12

标签: java list sorting arraylist duplicates

我的程序正在打开一个文件,然后从文件开头保存它们的单词和字节距离。虽然该文件有太多我不想要的重复单词。此外,我希望我的列表按字母顺序排列。问题是,当我修复订单时,副本会被弄乱,反之亦然。这是我的代码:

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;

class MyMain {
        public static void main(String[] args) throws IOException {
            ArrayList<DictPage> listOfWords = new ArrayList<DictPage>(); 
            LinkedList<Page> Eurethrio = new LinkedList<Page>(); 
            File file = new File("C:\\Kennedy.txt");
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
            //This will reference one line at a time...
            String line = null;
            int line_count=0;
            int byte_count; 
            int total_byte_count=0; 
            int fromIndex;

            int kat = 0;
            while( (line = br.readLine())!= null ){
                line_count++;
                fromIndex=0;
                String [] tokens = line.split(",\\s+|\\s*\\\"\\s*|\\s+|\\.\\s*|\\s*\\:\\s*");
                String line_rest=line;
                for (int i=1; i <= tokens.length; i++) {
                    byte_count = line_rest.indexOf(tokens[i-1]);
                    //if ( tokens[i-1].length() != 0)
                    //System.out.println("\n(line:" + line_count + ", word:" + i + ", start_byte:" + (total_byte_count + fromIndex) + "' word_length:" + tokens[i-1].length() + ") = " + tokens[i-1]);
                    fromIndex = fromIndex + byte_count + 1 + tokens[i-1].length();
                    if (fromIndex < line.length())
                        line_rest = line.substring(fromIndex);
                    if(!listOfWords.contains(tokens[i-1])){//Na mhn apothikevetai h idia leksh
                        //listOfWords.add(tokens[i-1]);
                        listOfWords.add(new DictPage(tokens[i-1],kat));
                        kat++;
                    }

                    Eurethrio.add(new Page("Kennedy",fromIndex));
                    }
                    total_byte_count += fromIndex;
                    Eurethrio.add(new Page("Kennedy", total_byte_count));
            }

            Set<DictPage> hs = new HashSet<DictPage>();
            hs.addAll(listOfWords);
            listOfWords.clear();
            listOfWords.addAll(hs);

            if (listOfWords.size() > 0) {
                Collections.sort(listOfWords, new Comparator<DictPage>() {
                    @Override
                    public int compare(final DictPage object1, final DictPage object2) {
                        return object1.getWord().compareTo(object2.getWord());
                    }
                   } );
               }
            //Ektypwsh leksewn...
            for (int i = 0; i<listOfWords.size();i++){
                System.out.println(""+listOfWords.get(i).getWord()+" "+listOfWords.get(i).getPage());
            }
            for (int i = 0;i<Eurethrio.size();i++){
                System.out.println(""+Eurethrio.get(i).getFile()+" "+Eurethrio.get(i).getBytes());
            }
        }
}

3 个答案:

答案 0 :(得分:2)

使用TreeSet而不是ArrayList,您将自动获得订单而不会重复。

答案 1 :(得分:0)

使用它。

public void stripDuplicatesFromFile(String filename) {
            try {
                BufferedReader reader = new BufferedReader(new FileReader(filename));
                Set<String> lines = new HashSet<String>(); 
                String line;
                while ((line = reader.readLine()) != null) {
                    lines.add(line);
                }
                reader.close();
                BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
                for (String unique : lines) {
                    writer.write(unique);
                    writer.newLine();
                }
                writer.close();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

它将filepath作为输入,找到重复的行并删除它们。但是如果你有大文件就不要使用它。我在.txt文件的非常小的尺寸上使用此方法(日志文件的种类和订单未导入)。

答案 2 :(得分:0)

首先,您为什么要使用ArrayList来存储您的单词列表。

ArrayList<DictPage> listOfWords = new ArrayList<DictPage>(); 

如果您不想要重复,则应使用Set(例如HashSetTreeSetSet的某些实现)来存储您的文字。

 Set<DictPage> listOfWords = new Hashset<DictPage>(); //no duplicates but not sorted

或者

Set<DictPage> listOfWords = new Treeset<DictPage>(); //no duplicates and sorted as well

这将确保您的单词列表不包含任何重复项。

如果您希望它们立即排序,您可以使用TreeSet,这样可以让您更轻松。