2013-03-19 170 views
3

如何让树状按字母顺序排序? 并删除重复..它已经让我坚持了一天。也许我需要得到一些睡眠..Treeset按字母顺序排序

public static void main(String[] args) { 
     String fileName = args[0]; 
     String words; 
     Scanner s = null; 
     Iterator itr; 

     try { 
      s = new Scanner(new BufferedReader(new FileReader(fileName))); 
       while (s.hasNext()) { 
        words = s.next(); 

        TreeSet<String> ts = new TreeSet<String>(); 
        ts.add(words); 

        System.out.println(ts); 
       } 
      } catch (FileNotFoundException fnfe) { 
      System.exit(0); 
     } finally { 
       if (s != null) { 
        s.close(); 
       } 
      } 
    }   
+4

你有重复的东西吗?在一个集合? – 2013-03-19 19:59:18

+3

你正在为每个单词制作一个新的TreeSet ... – n00begon 2013-03-19 19:59:51

+0

@KatjaChristiansen好吧,它*是*可能的 - 设计得很糟糕的'hashCode()'或'equals()' - 但我想它更加棘手'String' class :) – 2013-03-19 20:02:06

回答

6

TreeSet持有一个树形结构,它是自然顺序自动排序的集合。每个实现Comparable接口的类将被排序。 String类已经实现了Comparable接口,因此您不必进行任何分类,只需将其添加到TreeSet即可。

如果实现了hashCode()equals()方法,它们应该如何设置不能包含重复项。

编辑:TreeSet<String> ts = new TreeSet<String>();位于while()循环范围。你正在初始化它的每一个循环,并丢弃前一个数据。声明它在循环之外并且不要使用Collection.sort()

+2

对于'String','hashCode'和'equals'已经实现(正确)给你... – 2013-03-19 20:06:26

+1

当然,对于99.999%的情况,但仍然可能发生两个不同的字符串有散列冲突(相同的散列)。 – emd 2013-03-19 20:11:11

+2

@emd - 散列冲突的可能性是'equals'方法也需要实现的原因。 – Perception 2013-03-19 20:14:44