我想在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;
}
}
答案 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
(对整个数组进行两次迭代而不是使用我的新方法进行迭代)。