-4

如何从java中的给定数组中删除所有出现的整数,例如本例中的17?我尝试将条目设置为 (Integer) null 虽然它不起作用。

输入数组:[0,6,0,17,1,9,17,8,4]

输出数组:[0,6,0,1,9,8,4]

for(int i =0;i<ansa.length;i++){
if(ansa[i]==17)
      {
          ansa[i]=(Integer)null;
      }
}

这导致

Exception in thread "main" java.lang.NullPointerException
4

8 回答 8

2
int[] array = { 0,6,0,17,1,9,17,8,4 };
int[] filtered = Arrays.stream(array).filter(i -> i != 17).toArray();
System.out.println(Arrays.toString(filtered));

:-)

于 2013-10-24T14:00:30.453 回答
1

试试这个。

Integer[] array ={0,6,0,17,1,9,17,8,4};
List<Integer> list = new ArrayList<Integer>( Arrays.asList(array ));  
list.removeAll(Arrays.asList(17 ));
array =list.toArray(new Integer[0]);
System.out.println(Arrays.toString(array));
于 2013-10-24T13:56:41.583 回答
1

我尝试将条目设置为 (Integer) null 虽然它不起作用。

当然不会,因为数组的大小没有改变。为了做到这一点,一些已定义的 java 集合(特别是ArrayListIterator类)可以为您提供更好的方法。

在伪代码中:

Turn array into a List
Iterate over its elements
    If the element is the given number
        Remove it
Return the List as an Array

您可以填写空白,只需记住您实际上不能从数组中删除元素,因为它的大小是静态的。

注意:我要采用教育方法。

于 2013-10-24T13:56:54.210 回答
0

这似乎可行 - 尽管我怀疑人们会发布更好/更有效的解决方案。

public void test() {
  int[] before = new int[] {0,6,0,17,1,9,17,8,4};
  int[] after = remove(before, 17);
  System.out.println("Before: "+Arrays.toString(before));
  System.out.println("Aftre: "+Arrays.toString(after));
}

private int[] remove(int[] before, int remove) {
  // Work out how long it must be.
  int keep = 0;
  for ( int i = 0; i < before.length; i++ ) {
    if(before[i] != remove) {
      keep += 1;
    }
  }
  // Make the new one
  int[] after = new int[keep];
  // Fill it in.
  for ( int i = 0, j = 0; i < before.length; i++ ) {
    if(before[i] != remove) {
      after[j++] = before[i];
    }
  }
  return after;
}
于 2013-10-24T13:55:51.250 回答
0

那是一种可能的解决方案:

    int[] array1 = new int[]{0,6,0,17,1,9,17,8,4};
    ArrayList<Integer> result = new ArrayList<Integer>();
    boolean flag = true;

    for(int i = 0; i < array1.length; i++) {
        for(int j = 0; j < array1.length; j++) {
            if(array1[i]==array1[j]&&i!=j) {
                flag = false;
            }
        }
        if(flag) {
            result.add(array1[i]);
        }
        else{
            flag = true;
        }
    }

    System.out.println(result);
于 2013-10-24T13:57:16.437 回答
0

我认为,如果您不想使用 ArrayList,则必须计算数组中有多少 17,并使用 ansa.length-count 字段创建一个新的

于 2013-10-24T13:57:37.773 回答
0

您无法从当前使用 for 循环循环的数组中删除项目。目前,您正在到达数组的末尾并寻找下一个值,即使您已将其删除。数组长度指示器 (ansa.length) 不会像您想的那样自动更新。

您应该使用 List 和迭代器来循环遍历列表。您可以使用然后使用 .remove 功能

于 2013-10-24T13:59:27.643 回答
0

你快完成了!

    Integer[] ansa = new Integer[] { 0, 6, 0, 17, 1, 9, 17, 8, 4 };
    for (int i = 0; i < ansa.length; i++) {
        if (ansa[i] == 17) {
            ansa[i] = (Integer) null;
        }
    }

    for (Integer integer : ansa) {
        System.out.print(integer+","); //0,6,0,null,1,9,null,8,4,
    }

您正面临问题,因为您声明了原始我想,

int[] ansa = new int[] // Primitive
于 2013-10-24T14:00:02.080 回答