1

给定的任务是,编写一个程序,从文件中读取数字,从这些数字构造一个数组,并将所有零移动到数组的末尾。

例如。

之前:0、9、7、0、0、23、4、0

之后:9、7、23、4、0、0、0、0

在玩了大约 2 个小时后,我想出了这个。

import java.io.*;
import java.util.Scanner;

public class Compactor{

Scanner in;
private int numNum = 0;

public void calcNumNum(){
    try{
        in = new Scanner(new File("compact.txt"));
        while(in.hasNext()){
            int dumpVal = in.nextInt();
            numNum++;
        }
        makeArray(numNum);
    }catch(IOException i){
        System.out.println("Error: " + i.getMessage());
    }
}

private void makeArray(int x){
    int i = 0;
    int[] arrayName = new int[x];
    try{
        in = new Scanner(new File("compact.txt"));
        while(i < x){
            arrayName[i] = in.nextInt();
            i++;
        }
        compact(arrayName);
    }catch(IOException e){
        System.out.println("Error: " + e.getMessage());
    }
}

private void compact(int[] x){
    int counter = 0;
    int bCounter = (x.length - 1);
    for(int j = 0; j < x.length; j++){
        if(x[j]!=0){
            x[counter] = x[j];
            counter++;
        }else{
            x[bCounter] = x[j];
            bCounter--;
        }
    }
    printArray(x);
}

private void printArray(int[] m){
    int count = 0;
    while(count < m.length){
        System.out.print(m[count] + "  ");
        count++;
    }
}

}

给我们的文件是:0, 6, 13, 0, 0, 75, 33, 0, 0, 0, 4, 2,9 21, 0, 86, 0, 32, 66, 0, 0。

我得到的是:6、13、75、33、4、29、21、0、0、0、0、0、0、0、0、0、0、0、0、0。(没有逗号当然,我只是把它们放进去方便阅读。)

谁能告诉我如何解决这个问题,或者我应该用不同的方法重新开始我的代码,整体,

if(x[j]!=0){
    x[counter] = x[j];
    counter++;
 }else{
    x[bCounter] = x[j];
    bCounter--;
 }

我只是在飞行中编造它,认为它会正常工作,显然它在超过最后一个值后继续运行,并不断设置越来越多的值向后计数为零,但不知道如何使它工作,任何帮助将不胜感激。

4

4 回答 4

2

你几乎在那里compact()

private void compact(int[] x) {
    int counter = 0;
    for (int j = 0; j < x.length; j++) {
        if (x[j] != 0) {
            x[counter++] = x[j];
        }
    }
    while (counter < x.length) {
        x[counter++] = 0;
    }
    printArray(x);
}
于 2013-01-17T09:08:18.883 回答
0

解决此问题的另一种方法是创建一个相同大小的辅助数组,然后执行以下操作:

遍历第一个数组。如果数字非零,则将其放入第二个数组,为第二个数组保留一个计数器,从 0 开始,每当您向其中添加元素时增加 1。

由于 int 数组初始化为 0,因此在您遍历初始数组一次之后,您就完成了。第二个数组将保存答案。

// create your initial array x the same way as before

int[] y = new int[x.length];
int counter = 0;

for(int i = 0; i < x.length; i++) {

   if(x[i] != 0) {

      y[counter] = x[i];
      counter++;
   }
}
于 2013-01-17T09:02:47.663 回答
0

这部分看起来很合理

for(int j = 0; j < x.length; j++){
    if(x[j]!=0){
        x[counter] = x[j];
        counter++;
    }

}

它将所有非零元素放入数组的开头。问题是 else 部分,它覆盖了数组末尾的元素。由于您已经知道只有零属于数组的末尾,所以只需用零填充数组,从counter.

于 2013-01-17T09:06:23.677 回答
0

您也可以通过以下简单方式进行操作:(它由数组更改的逻辑组成。从文件中读取并存储在数组中对您来说非常清楚。)

package SO;

public class ZeroAtEnd {
    public static void main(String[] args) {
    int[] arr = new int[] { 0, 6, 13, 0, 0, 75, 33, 0, 0, 0, 4, 2, 9, 21, 0, 86, 0, 32, 66, 0, 0 };
    arr = makeZeroAtEnd(arr);
}

    private static int[] makeZeroAtEnd(int[] arr) {
    int l = arr.length;
    int leftCounter = 0;
    int rightCounter = l - 1;
    int[] finalArr = new int[l];
    for (int i = 0; i < l; i++) {
        if (arr[i] == 0) {
        // put at end
        finalArr[rightCounter] = arr[i];
        rightCounter--;
        } else {
        // put at beginning.
        finalArr[leftCounter] = arr[i];
        leftCounter++;
        }
    }
    for (int i : finalArr)
        System.out.println(i);
    return finalArr;
    }
}

输出

6
13
75
33
4
2
9
21
86
32
66
0
0
0
0
0
0
0
0
0
0
于 2013-01-17T09:24:46.163 回答