2013-05-07 29 views
0

我想创建一个简单的程序来查找两个数组中的重复元素。如果存在重复元素,则返回True否则返回false。使用HASHSET在两个数组之间找到重复的值

我写了这么多的代码,但它总是返回false。

List<String> list1= new ArrayList<String>(); 

    list1.add("abc"); 
    list1.add("xyz"); 
    list1.add("rst"); 

List<String> list2= new ArrayList<String>(); 

    list2.add("rst"); 
    list2.add("would"); 
    list2.add("why"); 

Set<String> set1 = new HashSet<String>(list1); 
Set<String> set2 = new HashSet<String>(list2); 

if(set1.contains(set2)){ 
     System.out.println("exists"); 
}else 
     System.out.println("doesn't exists"); 

上面的代码应该打印“存在”,即返回TRUE,但它不。我在这里错过了什么吗?

回答

3

您正在将所有元素添加到list1两次,而不是在第二个实例中添加到list2。这意味着set2将是空的,因此两者之间没有交集。

我也很怀疑你的使用HashSet.contains。难道你真的不想检查设置为路口,而不是set2set1?这看起来不太好。我建议你想做类似的事情:

Set<String> intersection = new HashSet<String>(set1); 
intersection.retainAll(set2); 

if (intersection.size() > 0) { 
    // print true 
} else { 
    // print false 
} 
+0

我想通了:),错别字编辑我的问题.. – 2013-05-07 06:51:34

+0

我无法想象它现在的工作,但? – Gian 2013-05-07 06:56:30

+0

@SJagdeesh是的,就像gian所说的那样,没有迭代,即使现在我猜也不会工作。 – 2013-05-07 07:09:41

1

你问set1它是否包含整个set2,它不。 set1可以在set2中包含元素。您应该使用循环或使用retainAllremoveAll,然后检查新尺寸是否与旧尺寸相同。

1

更改您的代码

for (String string : set2) { 
      if(set1.contains(string)){ 
       System.out.println("exists"); 
      }else 
       System.out.println("doesn't exists"); 
      } 

打印

doesn't exists 
exists 
doesn't exists 
+0

我认为,这是客观上与OP试图编写的程序不同的程序。这将执行'n'查找并写出'存在'或'不存在'的'n * m'行。如果* any *元素存在,OP的程序只输出一次。 – Gian 2013-05-07 07:12:26

+0

@Gian同意gian我亲自测试过它。只有一个条件是否有可能? – 2013-05-07 07:16:04

+0

是的。我在答案中给出了这样一个条件的例子。 – Gian 2013-05-07 07:31:49

0

Cehck out Set conatins() API

您的代码不检查的set2每个元素是否是可用的,而它检查是否set2对象可用。

如果我修改这样的代码,然后它会运行良好:

 set1.addAll(set2); 
    if(set1.containsAll(set2)){ 
      System.out.println("exists"); 
    }else 
      System.out.println("doesn't exists"); 

在检查一个具体string对象是否内部set2,一个解决方案可以是你通过它迭代并单独检查。