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

次の簡単な方法でも実行できます:(配列の変更のロジックで構成されています。ファイルからの読み取りと配列への格納はかなり明確です。)

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 に答える
0

この問題を解決する別の方法は、同じサイズの二次配列を作成してから、次のようにすることです。

最初の配列を反復処理します。数値がゼロ以外の場合は、2 番目の配列に入れ、0 から始まる 2 番目の配列のカウンターを保持し、要素を追加するたびに 1 ずつ増やします。

int 配列は 0 に初期化されるため、最初の配列を 1 回通過したら完了です。2 番目の配列は、答えを保持します。

// 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-part です。ゼロだけが配列の末尾に属していることは既にわかっているので、配列を から始めてゼロで埋めてcounterください。

于 2013-01-17T09:06:23.677 に答える