TreeSet会跟进

时间:2014-04-12 11:29:44

标签: java

我正在尝试通过一个小程序,并不能完全理解它。在某些地方,我认为它会出错,但我知道where =[]如果有人能指出我正确的方向,我会感激不尽。

import java.util.*;

public class Duplicates {

    //Here we have a main method


    public static void main(String[] args)
    {

    String[] words = args[0].split(" ");
    Set<String> uniques = new TreeSet<String>();
    Set<String> duplicates = new TreeSet<String>();

    for (String s : words) {
        if (!uniques.add(s)) {
        duplicates.add(s);
        }
    }

    uniques.removeAll(duplicates);
    System.out.println("Unique words "+uniques);
    System.out.print("Duplicate words "+duplicates);
    }

我理解它的作用(有点),但我不确定当你得到一个独特的词时会发生什么。就像在循环中那样if (!unique.add(s))所以只处理重复...?然后,当我们进入if语句时,它处理duplicates.add(s)。那么,我不明白如何将独特的内容添加到独特的集合中?

3 个答案:

答案 0 :(得分:1)

uniques.add(s))
  

如果指定的元素尚不存在,则将其添加到此集合中   http://docs.oracle.com/javase/7/docs/api/java/util/Set.html

该方法返回一个布尔值,如果成功则返回true,如果失败则返回false。感叹号会反转布尔值,如果它返回false则为!使它成为现实并且它可以继续将它添加到复制集中,如果复制集中已经存在它将失败,从而在第一组中仅给出一组唯一的项并将重复项转储到第二组但仅计算每个唯一字符串首先复制。

副本集不应该是一个集合,因为它不会计算总共有多少重复项。

  

假设您已输入&#34; abc&#34; &#34; DEF&#34; &#34; DEF&#34;

您将获得2个独特的项目和1个重复项。

  

但如果你输入&#34; abc&#34; &#34; ABC&#34; &#34; ABC&#34;

你会得到1个独特的项目和1个重复项,因为第二次尝试插入副本时它会失败,因为一个集合永远不会让你添加相同的东西两次。

然而,您的示例的意图似乎是输出仅在唯一集中输入一次的单词,并在重复集下输入多于一次的输出单词。

将字符串[]行更改为此

String[] words = new String[] { "a", "a", "b", "c" };

您的输出将是

  

独特的单词[b,c]

     

重复单词[a]

这是因为removeAll方法会在唯一集合中删除重复集中的任何项目。

答案 1 :(得分:0)

举个例子,然后走过去。

假设words = { "a", "b", "b", "c"}

现在最初"a"已添加到uniques 然后添加"b"

当第二个"b"到来时,uniques.add(s))会返回false,因为它已包含元素"b"。因此"b"添加了duplicates

然后"c"被添加到uniques

最后uniques.removeAll(duplicates)语句删除uniquesduplicates中存在的所有元素。因此,uniques中所有元素只出现一次,duplicates中所有元素重复多次

答案 2 :(得分:0)

input是一个String列表,输出是没有重复列表的列表。

在for循环中,所有输入字符串都添加到Set(uniques)中,该集合是唯一字符串的集合。

如果for循环中添加了当前字符串,则add方法返回false。 在这种情况下,字符串会添加到另一个集合(duplicates)。

循环结果之后的

应该是没有重复的字符串的所有字符串。

现在想想如何计算所有字符串减去重复3次的字符串?