2016-12-25 79 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); 

所以,如果它看到這個單詞已經在集合中,它會將它添加到愚蠢集。

希望幫助!