如何检测和删除数组中的两个以上重复项?

时间:2017-08-03 11:47:29

标签: java arrays

如果数组中有两个以上的重复项,如何检测和删除? 在下面的例子中,我采用了元素“10,20,30,40,40,40,50,60,70,80,10”的数组。这里40重复三次,重复10次两次。我可以编写一个程序来检测两个重复但我无法将40(重复三次)缩小到一次。 注意: - 我想在不使用任何java集合的情况下执行此操作

public class ArrayDuplicate {
public void run1()
{
    int[] a = {10, 20, 30, 40, 40, 40, 50, 60, 70, 80 ,10};
    int size=a.length;
    System.out.println("Array size before duplicate deletion "+size);
    for(int i =0;i<(size-1);i++)
    {
        for(int j=i+1;j<=(size-1);j++)
        {
            if(a[i]==a[j] &&i!=j)
            { 
                while(j<(size-1))
                {
                a[j]=a[j+1];
                j++;

                }
                size--;
            }

        }
    }
    System.out.print("The array after deleting the duplicates is ");
    for(int k=0;k<=(size-1);k++)
    {
        System.out.print(a[k]);  //40 is being printed twice
        if(k<(size-1))
        {
            System.out.print(",");
        }
        else
            System.out.print(".");
    }




}
public static void main(String[] args)
{
    ArrayDuplicate ob = new ArrayDuplicate();
    ob.run1();

}

}

6 个答案:

答案 0 :(得分:3)

你说过你只想为列表中的存在3次或更多的元素保留一个元素(而不是2)。 如果他们是2或更多,TreeSet将是您唯一需要的东西。

你说在出现3次或更多次之后,你只想保持1次。

你在这里:

int[] input = whatever_your_input;

List<Integer> result = new ArrayList<>();
Map<Integer, Integer> valueCounter = new HashMap<>();

for (int i=0; i<input.length; i++) {
    int counter = valueCounter.get(input[i]);
    if (counter = null) {
        counter = 0;
    } 
    valueCounter.put(input[i], counter++);
    if (counter <3) {
        result.add(input[i]);
    }
 }

结果将包含输出列表。

编辑:为了清楚起见,如果您不想要任何重复,只需要这样:

int[] input = whatever_your_input;

Set<Integer> result = new TreeSet<>();
for (int i=0; i<input.length; i++) {
     result.add(input[i]);
}

结果将包含您的原始列表,没有任何重复,同时保持相同的排序。

编辑2:好吧,看来OP想要的根本没有重复。此外,没有使用Java集合。我们走了:

int[] input = whatever_your_input;

int[] tmpResult = new int[input.length];
int tmpLength = 0;

for (int i=0; i<input.length; i++) {
    boolean duplicated = false;
    for (int j=0; j<tmpLength; j++) {
        if (tmpResult[j] == input[i]) {
             duplicated = true;
             break;
        }
     }
     if (!duplicated) {
         tmpResult[tmpLength] = input[i];
         tmpLength++;
     }
}
int[] result = new int[tmpLength];
System.arraycopy(tmpResult, 0, result, 0, tmpLength);

结果将包含相同顺序的值和重复的值。

答案 1 :(得分:2)

int[] a = {10, 20, 30, 40, 40, 40, 50, 60, 70, 80 ,10};
Set<Integer> set = new HashSet<Integer>();
for (int i : a) {
   set.add(i);
}
a = set.toArray(new int[set.size()]);

希望能帮到你!

答案 2 :(得分:1)

我认为OP不想使用集合来删除重复项。 所以我只修改了他的代码,如下所示。

for (int i = 0; i < (size - 1); i++) {
                  for (int j = i + 1; j <= (size - 1); j++) {
                        if (a[i] == a[j] && i != j) {
                              while (j < (size - 1)) {
                                    a[j] = a[j + 1];
                                    j++;

                              }
                              i--;//recheck in inner for loop is performed (i--) , to check adjacent duplicate element.
                              size--;
                        }

                  }
            }

这里执行内部for循环的重新检查(i - ),以检查相邻的重复元素。

答案 3 :(得分:1)

希望下面的代码可以。

$(window).load(function () {
   $('input').change(function(){
     var $this = $(this), $div = $('label.ui-button.ui-widget.ui-state-default[for=' + $this.attr('id') + ']');
        if( $this.is(':checked') )
        {
            $div.addClass('circle-checked');
        }
        else
        {
            $div.removeClass('circle-checked');
        }
    }).change();
});

答案 4 :(得分:1)

我知道为什么40会重复两次。在你的循环中,当i = 3且j = 4时,a [i] = a [j],所以在while循环中,数组向左移动,
a [4] = a [5],a [5] = a [6],a [6] = a [7],a [7] = a [8] ...
然后,
 a [] = {10,20,30,40,40,50,60,70,80,10},尺寸= 9,j = 9。
继续for循环,i = 4,j = 5,但是当i = 3时,a [3] = a [4] = 40,所以循环不能缩减40(重复三次)到一次。 我修改了你的代码,如下所示。

  public class ArrayDuplicate {
    public void run1()
    {
        int[] a = {10, 20, 30, 40, 40, 40, 50, 40, 60, 70, 80 ,10};
        int size=a.length;
        System.out.println("Array size before duplicate deletion "+size);
        for(int i =0;i<(size-1);i++)
        {
            for(int j=i+1;j<=(size-1);j++)
            {
                if(a[i]==a[j] &&i!=j)
                {      
                    int temp = j;
                    while(temp<(size-1))
                    {
                        a[temp]=a[temp+1];
                        temp++;
                    }
                    size--;
                    j=i;  
                }

            }
        }
        System.out.print("The array after deleting the duplicates is ");
        for(int k=0;k<=(size-1);k++)
        {
            System.out.print(a[k]);  //40 is being printed twice
            if(k<(size-1))
            {
                System.out.print(",");
            }
            else
                System.out.print(".");
        }
    }
    public static void main(String[] args)
    {
        ArrayDuplicate ob = new ArrayDuplicate();
        ob.run1();

    }
}

答案 5 :(得分:0)

Set的实现无法保留重复项,因此通过将所有值插入Set,所有删除操作都将被删除。

使用Java 8 Streams and Collections可以实现如下:

// Remove all duplicates by inserting into a Set
Set<Integer> noDupes = Arrays.stream(a).boxed().collect(Collectors.toCollection(TreeSet::new));

// Set to primitive array
a = noDupes.stream().mapToInt(Integer::intValue).toArray();

然后a将保留原始值减去重复项。