采用数组并将其压缩的方法

时间:2013-01-17 08:52:10

标签: java arrays

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

例如。

之前: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,80,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 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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++;
   }
}

答案 2 :(得分:0)

这部分看起来很合理

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

}

它将所有非零元素放入数组的开头。问题是else-part,它会覆盖数组末尾的元素。由于您已经知道只有零属于数组的末尾,因此只需从counter开始用零填充数组。

答案 3 :(得分: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