ArrayList, double contains

6
private static boolean moreThanOnce(ArrayList<Integer> list, int number) {
    if (list.contains(number)) {
        return true;
    }
    return false;
}

我怎样使用list.contains来检查一个数字是否在列表中出现了不止一次?我可以通过使用for循环创建一个方法,但我想知道是否可以使用.contains来完成。感谢您的帮助!
6个回答

5

你不能只使用contains来实现。它只是测试项目是否出现在列表中。

你可以使用indexOf来实现。有两种重载的indexOf,其中一种允许你设置从列表中开始搜索的位置。所以:在找到一个之后,从该位置的下一个位置开始:

int pos = list.indexOf(number);
if (pos < 0) return false;
return list.indexOf(number, pos + 1) >= 0;

或将最后一行替换为:

return list.lastIndexOf(number) != pos;

如果你想要更加简洁的方式(尽管在列表中元素不止一次出现时,这种方式需要两次遍历整个列表):

return list.indexOf(number) != list.lastIndexOf(number);

1
@Lukas,这很简单,但要注意我添加的“虽然”。 - Andy Turner

5

您可以使用Stream流:

private static boolean moreThanOnce(ArrayList<Integer> list, int number) {
    return list.stream()
               .filter(i -> i.equals (number))
               .limit(2) // this guarantees that you would stop iterating over the
                         // elements of the Stream once you find more than one element
                         // equal to number
               .count() > 1;
}

谢谢,您认为只使用.contains可以实现吗?另一位用户评论了“indexOf”。 - Lukas
1
@Lukas,使用contains()是不可能的。 - Eran
1
@Lukas - 仅使用contains()是不可能的,但您可以将contains()List的其他一些函数结合使用,使其正常工作。 - Arvind Kumar Avinash

3
如果你想要计算列表中某个元素出现的次数。
int times = list.stream().filter(e -> number==e).count();

2

其他人已经指出了问题。然而,通常情况下您可以使用 Collection.frequency 方法:

   private static boolean moreThanOnce(ArrayList<Integer> list, int number) {
        return Collections.frequency(list, number) > 1;
    }  

1
这个很聪明,而且相当简单。 - aran

2

Set的add方法返回一个布尔值,表示该值是否已存在(如果不存在,则为true;如果已存在,则为false)。

遍历所有值并尝试再次添加。

public Set<Integer> findDuplicates(List<Integer> listContainingDuplicates)
{ 
  final Set<Integer> setToReturn = new HashSet<>(); 
  final Set<Integer> set1 = new HashSet<>();

  for (Integer yourInt : listContainingDuplicates)
  {
   if (!set1.add(yourInt))
   {
    setToReturn.add(yourInt);
   }
  }
  return setToReturn;
}

2

免责声明

其他答案很好,因为它们解释了高效的方法,但这个解决方案的唯一目的是展示如何使用List :: contains来解决这个问题,这是问题的具体要求。请还要查看来自OP的以下评论请求。

谢谢,你认为只用.contains就可以吗?另一个用户评论了“indexOf”。


解决方案:

仅使用List :: contains不可能实现,但您可以将List :: containsList的其他一些函数结合起来使用并使其正常工作。

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        // Tests
        List<Integer> list = List.of(10, 20, 10, 30);
        System.out.println(moreThanOnce(new ArrayList<>(list), 10));
        System.out.println(moreThanOnce(new ArrayList<>(list), 20));
    }

    private static boolean moreThanOnce(List<Integer> list, int number) {
        if (list.size() == 1) {
            return false;
        }
        if (list.get(0) == number && list.subList(1, list.size()).contains(number)) {
            return true;
        }
        return moreThanOnce(list.subList(1, list.size()), number);
    }
}

输出:

true
false

1
其他答案都很好,因为它们解释了高效的方法,但这是本页上唯一精确符合问题要求的答案。尽管如此,这个答案却被投票降低了。可能投票者永远不会回来提供反馈,但我不会删除我的答案,希望未来的访问者能给我一些反馈。 - Arvind Kumar Avinash
1
热爱递归方法 - aran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接