一种返回没有重复的数组的方法

时间:2018-07-16 21:42:51

标签: java arrays

我应该在Java中实现一个方法,该方法返回没有重复的整数数组。我已经做到了,但是我的解决方案似乎很长。我想知道改善它的方法。

我添加了注释,以便您的人更容易理解代码的作用。

public class IntArrayProcessor {

    private int[] a;

    public IntArrayProcessor(int[] a) {
        this.a = a;
    }

    /**
     * 
     * @return Array with no repeated integers.
     */
    public int[] getSet() {
        /* creates an array with the same entries and length as this.a */
        int[] duplicateA = new int[this.a.length];

        /* stores the number of repeated entries in array this.a */
        int numberOfDuplicates = 0;

        /* is the integer a duplicate or not? */
        boolean isDuplicate;

        /**
         * Counts the number of duplicates in array this.a
         */
        for (int i = 0; i < this.a.length; i++) {
            duplicateA[i] = this.a[i];
        }

        for (int i = 0; i < duplicateA.length; i++) {
            isDuplicate = false;
            for (int j = i + 1; j < this.a.length; j++) {
                if (duplicateA[i] == this.a[j]) {
                    isDuplicate = true;
                }
            }
            if (isDuplicate) {
                numberOfDuplicates++;
            }
        }

        /*
         * the noDuplicate array has the lenght of the this.a array minus the
         * number of repeated entries
         */
        int[] noDuplicate = new int[this.a.length - numberOfDuplicates];

        /* to keep track of the noDuplicate indexes */
        numberOfDuplicates = 0;

        /**
         * An array with no repeated numbers
         */
        for (int i = 0; i < duplicateA.length; i++) {
            isDuplicate = false;
            for (int j = i + 1; j < this.a.length; j++) {
                if (duplicateA[i] == this.a[j]) {
                    isDuplicate = true;
                }
            }
            if (!(isDuplicate)) {
                noDuplicate[numberOfDuplicates] = duplicateA[i];
                numberOfDuplicates++;
            }
        }
        return noDuplicate;
    }
}

2 个答案:

答案 0 :(得分:1)

一个简单的解决方案是使用Stream API:

int[] distinctArray = IntStream.of(a).distinct().toArray();

如果您不想使用Stream API,则可以使用HashSet(或其他实现Set接口的集合)。

Set<Integer> set = new HashSet<Integer>(Arrays.asList(array));

答案 1 :(得分:0)

那是一些相当长的代码!似乎您正在寻找比Max提出的更自制的解决方案!以下是一些我可以做的伪代码:

1.创建一个包含int并返回boolean的字典。
2.对于起始数组中的每个元素,将其boolean的值true添加到字典中(即使值实际上无关紧要)。
3.在字典中找到键的数量(这将是在第一个数组中找到的唯一值的数量,这也是新数组的长度)
4.给定在上一步中找到的长度,创建一个新数组。 5.浏览字典中的每个键,并将其添加到新数组中!

快捷方式:通常,从步骤4和5而不是从字典中获取键将返回一个数组,这将是您的最终解决方案。

如果有帮助的话,我很乐意写一个更正式的解决方案。

注意:如果您只熟悉Java,则Dictionary与HashMaps几乎是 同义词,在这种情况下可以互换使用 。 Java的字典的默认实现被称为HashMap
注意2:在Dictionary / HashMap中访问键数/获取所有键应该是内置函数,而不是您必须编写的函数!