在Java中查找重复和非重复

时间:2016-11-07 19:56:23

标签: java arrays duplicates

我知道这个问题已经多次回答“如何找到”,但我还有一些其他问题。这是我的代码

public static void main (String [] args){

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

    l1.add("Apple");
    l1.add("Orange");
    l1.add("Apple");
    l1.add("Milk");

    //List<String> l2=new ArrayList<String>();
    //HashSet is a good choice as it does not allow duplicates
    HashSet<String> set = new HashSet<String>();

    for( String e: l1){

        //if(!(l2).add(e)) -- did not work
        if(!(set).add(e)){
            System.out.println(e);
        }

问题1:列表不起作用,因为List允许重复,而HashSet不是 - 这是正确的假设吗?

问题2:这一行意味着什么:if(!(set).add(e)) 在for循环中,我们检查String e是否在列表l1中,然后该行验证if(!(set).add(e))

此代码将打印apple作为输出,因为它是重复值。

问题3:我怎样才能打印出非重复值,只有Orange和Milk而不是Apple?我试过这种方法,但它仍然打印Apple。 List unique = new ArrayList(new HashSet(l1));

提前感谢您的时间。

4 个答案:

答案 0 :(得分:4)

  1. 你是对的。
  2. 嗯......添加到集合中并不需要返回任何内容。幸运的是,如果项目成功添加到集合中,来自Sun或Oracle的人员决定返回消息。这由true/false返回值表示。 true取得成功。
  3. 您可以使用以下逻辑扩展当前代码:如果元素未成功添加到集合中,则表示它是重复的,因此将其添加到另一个集Set<> duplicates,然后删除所有{{来自duplicates
  4. 的1}}

答案 1 :(得分:3)

  

问题1:列表不起作用,因为List允许重复,而HashSet不是 - 这是正确的假设吗?

这是正确的。

  

问题2:这一行是什么意思:if(!(set).add(e))在for循环中,我们检查String e是否在列表l1中,然后该行验证是否(!(设定)。新增(e))的

     

此代码将打印apple作为输出,因为它是重复值。

set.add(e)尝试向集合添加元素,并返回boolean,表示是否已添加。否定结果将导致忽略新元素并打印重复项。请注意,如果元素存在3次,则会打印两次,依此类推。

  

问题3:我怎样才能打印出非重复值,只有Orange和Milk而不是Apple?我试过这种方法,但它仍然打印Apple。 List<String> unique= new ArrayList<String>(new HashSet<String>(l1));

有很多方法可以解决这个问题。这个没有最好的表现,但它非常简单:

for (int i = 0; i < l1.size(); i++) {
    boolean hasDup = false;
    for (int j = 0; j < l1.size(); j++) {
        if (i != j && l1.get(i).equals(l1.get(j))) {
            hasDup = true;
            break;
        }
    }
    if (!hasDup) {
        System.out.println(e);
    }
}

答案 2 :(得分:3)

1)是的,这是正确的。我们经常使用集来删除重复项。

2)当项目已经在集合中时,add的{​​{1}}方法返回false。这就是它用于检查项目中是否存在该项目的原因。

3)为此,您需要计算数组中每个项目的出现次数,将它们存储在哈希映射中,然后打印出计数为HashSet的项目。或者,您可以这样做(这有点脏并且速度较慢!但是,这种方法比使用哈希映射需要的空间少一些。)

1

答案 3 :(得分:1)

使用/ java8 power ...

public static void main(String[] args) {
List<String> l1 = new ArrayList<>();

l1.add("Apple");
l1.add("Orange");
l1.add("Apple");
l1.add("Milk");

// remove duplicates
List<String> li = l1.parallelStream().distinct().collect(Collectors.toList());
System.out.println(li);

// map with duplicates frequency
Map<String, Long> countsList = l1.stream().collect(Collectors.groupingBy(fe -> fe, Collectors.counting()));
System.out.println(countsList);
// filter the map where only once 
List<String> l2 = countsList.entrySet().stream().filter(map -> map.getValue().longValue() == 1)
    .map(map -> map.getKey()).collect(Collectors.toList());
System.out.println(l2);
}