使用Collections Java查找唯一的重复单词

时间:2016-12-25 22:42:30

标签: java collections

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

该程序分割重复的单词,独特的单词。

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);

3 个答案:

答案 0 :(得分:2)

来自add Set方法的true

  

for (String a : args)如果此集合尚未包含指定的元素

所以代码的作用是:

  1. args:迭代存储在if (!uniques.add(a))数组中的所有输入字符串。
  2. true:如果add方法返回Set,则该字符串是唯一的,并已成功添加到uniques add,因为它尚未包含,但是(请参阅文档)。否则,false方法会返回a(当前字符串Set已包含在uniques dups.add(a);中,所以......
  3. Set:...将其添加到重复元素的Set
  4. 作为初学者的注释,a只能包含一次的单个元素。因此,如果uniques已经在uniques.add(a),则true只会返回false,但实际上不会添加。如果没有,则添加元素并返回var gamekeys = JSON.parse(fs.readFileSync('gamekeys.json')); var jsonstring = JSON.stringify(gamekeys, null, 4); UpdateGamePricelist(); function UpdateGamePricelist() { for(var i = 0;i<gamekeys.keys.length;i++) { appid = gamekeys.keys[i].appid; var apiurl = "http://store.steampowered.com/api/appdetails?appids="+appid; if (i < 95) { request(apiurl, function(err, response, body) { if (err) { console.log("Error when updating game prices: " + err+"\n"); return; } var apiresponse = JSON.parse(body); if (body == "") { console.log("Could not find a pricelist m8"); return; } fs.writeFile("C:/Users/ahmad/Desktop/Bots/SteamKeyProfitter/gamespricelist/"+appid+".json", body, function(err) { if(err) { console.log("Error saving data to game pricelist: " + err); return; } console.log("Game pricelist has been updated!"); }); }); } } }

答案 1 :(得分:2)

有关add的文档:

  

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

,则返回true

这意味着代码&#34;尝试&#34;将对象插入uniques,如果add返回false,则对象已经存在,意味着它实际上是重复的 - 因此如果{dups,它会被插入uniques.add 1}}是false

之后dups中的所有条目都会从uniques中删除:

uniques.removeAll(dups);

之后uniques仅包含仅出现一次的字符串,而dups包含多次出现的所有字符串。

答案 2 :(得分:1)

   if (!uniques.add(a))
如果已添加的单词不在集合中,则

uniques.add(a)将返回True。如果它在里面则为False(此方法返回Boolean类型)。

       dups.add(a);

因此,如果它看到该单词已经在该集合中,则会将其添加到欺骗集中。

希望有所帮助!