如何在不使用循环的情况下从数组中查找重复值

时间:2016-11-21 05:40:40

标签: java arrays loops

任何人都可以帮我提供从数组中查找重复值的代码。这里的条件是没有循环语句。我尝试使用递归方法,但它没有成功。请有人帮我这个。

我的尝试:

public static void main(String[] args) {
    Integer a[] = { 1, 2, 7, 3, 4, 5, 2, 7 };
    ArrayList<Integer> al = new ArrayList<Integer>(Arrays.asList(a));
    if (duplicate(al) == true) {
        System.out.println("Duplicate");
    }
}

static int i = 1;

private static boolean duplicate(ArrayList<Integer> al) {

    if (al.get(i) != null) {
        if (al.get(i - 1) == al.get(i)) {
            System.out.println("Duplicate are : " + al.get(i));
        }
    } else {
        return true;
    }
    i++;
    return duplicate(al);
}

4 个答案:

答案 0 :(得分:1)

请参考以下代码以查找无循环的数组中的重复项

公共类ArrayDuplicate {

public static void main(String[] args) {

    findDuplicateElementsInArray(new int[] { 20, 10, 20, 5, 10 });

}

private static void findDuplicateElementsInArray(int arr[]) {

    Set<Integer> uniqueElements = new LinkedHashSet<Integer>();

    Arrays.stream(arr).filter(i -> !uniqueElements.add(i)).forEach(System.out::println);

}

}

答案 1 :(得分:0)

这不是一个很好的递归用例,这让我想知道问题的关键点是什么。然而,值得注意的是,LISP程序员(从我所观察到的)传统上一直使用递归;早期版本的语言可能没有任何类型的循环结构。以这种方式编程时,人们习惯于弄清楚如何使用递归算法,这种算法将成为任何其他语言的循环。

我认为,主要技术是弄清楚你需要保留哪些运行局部变量,并将它们作为参数传递给递归辅助函数。

要通过循环来解决这个问题,我会定义一个最初为空的Set。当我浏览数组时,我会:(1)查看数组元素是否已经在集合中,如果是,则返回true; (2)将元素添加到集合中。

此处,Set是您需要保留的运行变量。数组索引是另一个“运行变量”。 (在经典的LISP中,你只需使用一个cdr函数,这意味着“列表的其余部分”,所以你不需要维护一个索引;我认为用Java很容易做到这一点ArrayList。)因此,您需要一个具有Set和“当前索引”作为参数的递归方法:

private boolean hasDuplicateHelper(ArrayList<Integer> a, int currentIndex, Set<Integer> alreadySeen) { ... }

outer方法将set初始化为空集,并使用此set调用helper,并将0作为当前索引。递归方法将(1)查看当前元素并查看它是否在alreadySeen中,如果是,则返回true; (2)将当前元素添加到集合中; (3)使用新集合作为alreadySeen参数递归调用该方法,并使用当前索引的相应新值(我会让你想出那个)。

我会留给你解决其余细节,例如如何停止。

编辑:现在从评论中可以清楚地看到,期望的结果是打印重复值而不是“是”或“否”,必须改变一些东西。但我认为只需将方法结果更改为包含一组所有重复项的Set<Integer>即可。如果需要更多信息,例如重复发生的索引或每次重复发生的次数,则可能必须使用不同的结果结构。

答案 2 :(得分:0)

我完成了代码,无需使用循环语句即可从数组中找到重复的数字。我实现了两次递归来完成代码。请检查下面的代码

$("#tblInfo").dataTable({
            'pageLength': 25,
            'lengthMenu': [[10, 25, 50, 100, 150, 200, 250], [10, 25, 50, 100, 150, 200, 250]]
        });

答案 3 :(得分:0)

您可以尝试一下。如果传递数组对象,则它将返回重复计数。

    public static int findDuplicatesCountOnArray(Integer[] arr) {
    List<Integer> list = new ArrayList<Integer>();
    if (arr != null) {
        list.addAll(Arrays.asList(arr));
    }
    HashSet<Integer> set = new HashSet<Integer>(list);
    return list.size() - set.size();
}