如何删除值相等的数组元素?

时间:2014-06-02 08:51:19

标签: java arrays

在java代码中使用ArrayUtills可以从java数组中删除元素。 下面是删除特定索引处元素的代码(代码中为'2',删除元素值等于'10'。

import java.util.Arrays;

import org.apache.commons.lang3.ArrayUtils;


public class RemoveObjectFromArray{

 public static void main(String args[]) {


     int[] test = new int[] { 10, 13, 10, 10, 105};

     System.out.println("Original Array : size : " + test.length );
     System.out.println("Contents : " + Arrays.toString(test));

     //let's remove or delete an element from Array using Apache Commons ArrayUtils
     test = ArrayUtils.remove(test, 2); //removing element at index 2

     //Size of array must be 1 less than original array after deleting an element
     System.out.println("Size of array after removing an element  : " + test.length);
     System.out.println("Content of Array after removing an object : "
                       + Arrays.toString(test));

 } }

它将输出显示为:

run:
Original Array : size : 5
Contents : [10, 13, 10, 10, 105]
Size of array after removing an element  : 4
Content of Array after removing an object : [10, 13, 10, 105]

如何修改代码以获得以下输出:

run:
Original Array : size : 5
Contents : [10, 13, 10, 10, 105]
Size of array after removing an element  : 2
Content of Array after removing an object : [ 13, 105]

5 个答案:

答案 0 :(得分:3)

试试此代码

while (ArrayUtils.contains(test, 10))  {
  //let's remove or delete an element from Array using Apache Commons ArrayUtils
  test = ArrayUtils.removeElement(test, 10); //removing element with value 10
}

它应该可以解决你的问题。

答案 1 :(得分:2)

我会在你的情况下使用ArrayList,但如果你想坚持使用你的数组,你可以执行以下操作:

int count = 0;
for(int i = 0; i < test.length; i++){
  if (test[i] == 10) {
    count++;
  }
 }
 int[] newTest = new int[count];
 count = 0;
 for( int = 0; i < test.length; i++){
   if(test[i] != 10){
     newTest[count++] = test[i];
   }
  }

我没有测试它

答案 2 :(得分:2)

虽然不是一种优雅的方式,但如果你只想使用数组,你可以使用以下内容:

public static void removeDupes(int[] array) {

    int[] forbiddenNumbers = new int[array.length];

    Arrays.sort(array);

    for(int number : array) {
        if(ArrayUtils.contains(forbiddenNumbers, number){
            int index = Arrays.binarySearch(array, number);
            while(index >= 0) {
                ArrayUtils.remove(array, index);
                index = Arrays.binarySearch(array, number);
            }
            ArrayUtils.remove(forbiddenNumbers, Arrays.binarySearch(forbiddenNumbers, number);
        } else {
            ArrayUtils.add(forbiddenNumbers, number);
        }
    }
}

这适用于阵列中存在的任何欺骗。

这样做基本上是通过数组,保存在另一个数组中的所有唯一数字,一旦在数组中遇到重复,它将删除原始数组中该数字的所有实例,之后它将从中移除数字唯一编号数组,因为它不再出现在原始数组中。

这是一个非常难以破解的解决方案,您应该认真考虑使用其他方法(例如使用集合),但如果您想在纯数组中执行此操作,那么这应该可行。

答案 3 :(得分:2)

这只能在一个循环中完成工作,而不会增加其他库或数据结构的开销,复杂性O(n)

        int[] test = new int[] { 10, 13, 10, 10, 105};
        int tobeDel = 10;
        int[] tmp = new int[test.length];
        int j=0;
        for (int i=0;i<test.length;i++) {
            if (test[i] == tobeDel) {
                continue;
            }    
            tmp[j] = test[i];
            j++;
        }
        int[] result = new int[j];
        System.arraycopy(tmp, 0, result, 0, j);

如果您编写自己的方法,请返回result

答案 4 :(得分:1)

解决方案1 ​​

我从来没有为您的要求找到任何单一功能,但这段代码可以。

while(ArrayUtils.removeElement(test,10).length!=test.length)
    test=ArrayUtils.removeElement(test,10);

您可以使用removeElement删除元素并返回新数组。如果没有要删除的内容,则会返回相同的列表。


解决方案2

这也会做同样但没有任何迭代。如果这就是你要找的东西。

Arrays.sort(test);
int[] finalValue =ArrayUtils.subarray(test, 0, ArrayUtils.indexOf(test,10));
ArrayUtils.addAll(finalValue,ArrayUtils.subarray(test,ArrayUtils.lastIndexOf(test,10), test.length));

这将对数组进行排序,并将数组从开始到第一次出现,然后从最后一次出现到数组末尾。!!