2016-12-25 313 views
2

我正在通过Oracle Docs Java中的Java Collections。我无法从下面找出几行代码。

该程序拆分重复的单词,唯一的单词。使用集合Java查找独特的重复单词Java

public class FindDups { 
    public static void main(String[] args) { 
     Set<String> uniques = new HashSet<String>(); 
     Set<String> dups = new HashSet<String>(); 

     for (String a : args) 
      if (!uniques.add(a)) 
       dups.add(a); 

     // Destructive set-difference 
     uniques.removeAll(dups); 

     System.out.println("Unique words: " + uniques); 
     System.out.println("Duplicate words: " + dups); 
    } 
} 

我不能让这些线。任何人都可以解释,实际上 发生在这里?

for (String a : args) 
    if (!uniques.add(a)) 
     dups.add(a); 

回答

2

Oracle docsadd方法Set

true如果此set尚未包含指定的元素,

那么什么代码所做的是:

  1. for (String a : args):迭代存储在args数组中的所有输入字符串。
  2. if (!uniques.add(a)):如果加载方法返回true,该字符串是独特的,成功添加到Setuniques,因为它是不包含的,但(见文档)。否则,add方法返回false(当前字符串a已经包含在Setuniques)所以...
  3. dups.add(a);:...其添加到重复元素的Set

对于初学者一张纸条,一个Set只能包含一个单独的元素一次。所以,如果a已经在uniques,电话uniques.add(a)只会返回true,但不实际上加任何东西。如果不是,则添加元素并返回false

2

从文档关于add

返回: 如果此set尚未包含指定的元素,

这意味着代码“尝试”插入对象为uniques和如果add返回false该对象已经存在,这意味着它实际上是重复的 - 因此,如果uniques.addfalse,它将被插入到dups中。

随后在dups所有条目也会从uniques删除:

uniques.removeAll(dups); 

之后uniques仅包含当前字符串只有一次,而dups包含产生多次的所有字符串。

1
if (!uniques.add(a)) 

uniques.add(a)将返回True,如果添加的单词不在集合中。如果它在里面,则为False(该方法返回布尔类型)。

 dups.add(a); 

所以,如果它看到这个单词已经在集合中,它会将它添加到愚蠢集。

希望帮助!