移位数组中的数字

时间:2018-02-06 21:39:36

标签: java arrays

我想在java中创建一个方法,它将采用一维数组并将所有非零数字移到数组的左侧。我尝试了一些方法,但没有任何工作。有人能帮助我吗?以下示例供您参考:

int[] x = {0,8,0,7,0,0,2};
answer = {8,7,2,0,0,0,0}

int[] y = {5,0,0,0,1,0,3};
answer = {5,1,3,0,0,0,0}

这就是我的尝试:

import java.util.Arrays;

public class Board
    {

    public static final int EMPTY = 0;

    public static boolean alterOneLine(int[] x)
    {
        int[] temp = new int[x.length];
        for(int i=0;i<x.length;i++)
        {
            if (x[i]!=EMPTY)
                temp[i]=x[i];
        }
        if(Arrays.equals(x,temp))
            return false;
        else
            return true;
    }
}

2 个答案:

答案 0 :(得分:5)

只需迭代并将非零数字移动到开头:

for (int i = 0, dest = 0; i < arr.length; i++) {
    if (arr[i] != 0) {
        int val = arr[i];
        arr[i] = 0;
        arr[dest++] = val;
    }
}

或者您可以制作副本并依赖于零的数组初始化默认值:

int[] copy = new int[arr.length];
for (int i = 0, dest = 0; i < arr.length; i++) {
    if (arr[i] != 0) {
        copy[dest++] = arr[i];
    }
}

或者,您可以使用带有自定义排序的盒装流:

int[] copy = Arrays.stream(arr)
        .boxed()
        .sorted(Comparator.comparing(i -> i == 0))
        .mapToInt(Integer::intValue)
        .toArray();

或者您可以使用Guava的Ints.asList()并对阵列进行排序:

Ints.asList(arr).sort(Comparator.comparing(i -> i == 0));

答案 1 :(得分:0)

正如我在评论中所说,你的方法不需要移动数组,因为该方法只检查给定是否已经移位(并且在这种情况下返回void filter_scan(std::array<float, 270>& scan){ for(float& val : scan) { // Notice the "&"! if(val < 0.5 || val > 2) val = 0; } } 。但为了回答,这里是更正后的版本:

false

在为import java.util.Arrays; public class Board { public static final int EMPTY = 0; public static boolean alterOneLine(int[] x) { int[] temp = new int[x.length]; int tempCounter = 0; for (int i = 0; i < x.length; i++) { if (x[i] != EMPTY) temp[tempCounter++] = x[i]; } if (Arrays.equals(x, temp)) return false; else return true; } public static boolean alterOneLine2(int[] x) { boolean zeroSeen = false; for (int i = 0; i < x.length; i++) { if (x[i] != 0 && zeroSeen) { return true; } if (x[i] == 0) { zeroSeen = true; } } return false; } public final static void main(String[] args) { System.out.println(alterOneLine(new int[]{0,8,0,7,0,0,2})); System.out.println(alterOneLine(new int[]{8,7,2,0,0,0,0})); System.out.println(alterOneLine(new int[]{5,0,0,0,1,0,3})); System.out.println(alterOneLine(new int[]{5,1,3,0,0,0,0})); System.out.println(alterOneLine2(new int[]{0,8,0,7,0,0,2})); System.out.println(alterOneLine2(new int[]{8,7,2,0,0,0,0})); System.out.println(alterOneLine2(new int[]{5,0,0,0,1,0,3})); System.out.println(alterOneLine2(new int[]{5,1,3,0,0,0,0})); } } 分配值时,您的错误使用相同的索引而不是单个计数器,只有将值向左移动才会增加。

我还添加了第二个具有相同功能的方法,但没有创建临时数组和后续调用temp(对整个数组进行两次迭代而不是使用我的新方法进行迭代)。