树集按字母顺序排序

4

我该如何让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
你有重复的元素吗?在一个集合里? - Modus Tollens
3
你正在为每个单词创建一个新的TreeSet... - n00begon
@KatjaChristiansen 嗯,这是可能的 - 由于糟糕设计的 hashCode()equals() - 但我想使用封闭的 String 类更加棘手 :) - Maarten Bodewes
创建一个TreeSet来存储所有单词,不必调用Collections.sort方法。 - Louis Wasserman
1个回答

7

TreeSet将集合存储在自动排序的树结构中。实现Comparable接口的每个类都将被排序。String类已经实现了Comparable接口,因此您无需执行任何操作即可对其进行排序,只需将其添加到TreeSet中。

如果正确实现了hashCode()equals()方法,则集合不会包含重复项。

编辑: TreeSet<String> ts = new TreeSet<String>();位于while()循环范围内。您正在每次循环时初始化它并且丢失上一个循环的数据。将其声明在循环外部,并且不要使用Collection.sort()


2
对于 String 类,hashCodeequals 方法已经为您正确实现了... - Louis Wasserman
1
虽然在99.999%的情况下是可以确定的,但仍有可能发生两个不同的字符串具有哈希碰撞(相同的哈希值)。 - emd
2
@emd - 哈希冲突的可能性是实现equals方法的原因,而且必须正确实现。 - Perception
我正在使用一个文本文件导入单词,这些单词是“this is a test of the import function function”(所以有一个重复的单词)。但如果它被自动排序,为什么它显示在文本文件中的序列中而不是按字母排序,并且重复的单词也没有被删除?如果这是个初学者问题,请原谅! - A C
你给我们的main程序没有打印任何东西。请给我们一个实际使用的代码示例和一些样本输入,以便我们找出问题所在。 - Louis Wasserman
TreeSet<String> ts = new TreeSet<String>(); 位于 while() 循环作用域中。您每次循环都在初始化它,导致丢失了上一个循环的数据。将其声明在循环外部,不要使用 Collection.sort()。 - emd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接