0

偶数と奇数の両方の配列を取り、すべての偶数を 1 つの配列に入れ、すべての奇数を別の配列に入れるプログラムを作成する必要があります。for ループを使用してすべての数値を循環し、それらが偶数か奇数かを判断しましたが、問題は、元の配列の数値がランダムであるため、偶数のサイズがわからないことですまたは奇数配列であるため、元の配列の数字を偶数/奇数配列に割り当てる方法がわかりません。スポットの束が残ったり、すべての数字に十分なスポットがなかったりすることはありません。何か案は?

4

7 に答える 7

4

ArrayList を使用してみてください。使用できます

num % 2 == 0

num が偶数か奇数かを確認します。== 0 の場合は偶数、そうでない場合は奇数です。

List<Integer> odds = new ArrayList(); 
List<Integer> evens = new ArrayList();

for (int i = 0; i< array.length; i++) {
   if (array[i] % 2 == 0) {
      evens.add(array[i]);
   }
   else {
       odds.add(array[i]);
   }
}

ArrayLists を変換して配列に戻すことができます

int[] evn = evens.toArray(new Integer[evens.size()]);

(注:テストされていないコードのため、いくつかのタイプミスがある可能性があります)

編集:

ArrayLists の使用が許可されていない場合は、Arrays のみを使用する次のことを検討してください。元の配列の2つのパスを実行する必要があるため、効率的ではありません

int oddSize = 0; 
int evenSize = 0; 

for (int i = 0; i< array.length; i++) {
   if (array[i] % 2 == 0) {
      evenSize++;
   }
   else {
      oddSize++;
   }
}


Integer[] oddArray = new Integer[oddSize];
Integer[] evenArray = new Integer[evenSize];

int evenIdx = 0;
int oddIdx = 0;

for (int i = 0; i< array.length; i++) {
   if (array[i] % 2 == 0) {
      evenArray[evenIdx++] = array[i];
   }
   else {
      oddArray[oddIdx++] = array[i];
   }
}
于 2012-09-03T21:27:10.503 に答える
1

配列や「%」を使用せずに実行できます単純なアイデア

input = new Scanner(System.in);
    int x;
    int y = 0; // Setting Y for 0 so when you add 2 to it always gives even
                // numbers
    int i = 1; // Setting X for 1 so when you add 2 to it always gives odd
                // numbers
    // So for example 0+2=2 / 2+2=4 / 4+2=6 etc..
    System.out.print("Please input a number: ");
    x = input.nextInt();

    for (;;) { // infinite loop so it keeps on adding 2 until the number you
                // input is = to one of y or i
        if (x == y) {
            System.out.print("The number is even ");
            System.exit(0);
        }
        if (x == i) {
            System.out.print("The number is odd ");
            System.exit(0);
        }
        if (x < 0) {
            System.out.print("Invald value");
            System.exit(0);
        }
        y = y + 2;
        i = i + 2;

    }

}
于 2015-03-28T14:47:57.977 に答える
0

上記の答えは正解であり、人々が通常これをどのように実装するかを説明しています。しかし、あなたの問題の説明は、これが動的リストがおそらく歓迎されない種類のクラス割り当てであると私に思わせます。

だからここに代替案があります。

配列をソートして、奇数と偶数の2つの部分に分割します。次に、奇数/偶数の数を数え、値を2つの配列にコピーします。

このようなもの:

static void insertionSort(final int[] arr) {
    int i, j, newValue;
    int oddity;
    for (i = 1; i < arr.length; i++) {
        newValue = arr[i];
        j = i;
        oddity = newValue % 2;
        while (j > 0 && arr[j - 1] % 2 > oddity) {
            arr[j] = arr[j - 1];
            j--;
        }
        arr[j] = newValue;
    }

}

public static void main(final String[] args) {
    final int[] numbers = { 1, 3, 5, 2, 2 };
    insertionSort(numbers);

    int i = 0;
    for (; i < numbers.length; i++) {
        if (numbers[i] % 2 != 0) {
            i--;
            break;
        }
    }

    final int[] evens = new int[i + 1];
    final int[] odds = new int[numbers.length - i - 1];
    if (evens.length != 0) {
        System.arraycopy(numbers, 0, evens, 0, evens.length);
    }
    if (odds.length != 0) {
        System.arraycopy(numbers, i + 1, odds, 0, odds.length);
    }

    for (int j = 0; j < evens.length; j++) {
        System.out.print(evens[j]);
        System.out.print(" ");
    }
    System.out.println();
    for (int j = 0; j < odds.length; j++) {
        System.out.print(odds[j]);
        System.out.print(" ");
    }
}
于 2012-09-03T22:15:00.337 に答える
0

次のコードを使用します。

public class ArrayComparing {

    Scanner console= new Scanner(System.in);
    String[] names;
    String[] temp;
    int[] grade;

    public static void main(String[] args) {
        new ArrayComparing().getUserData();
    }

    private void getUserData() {
        names = new String[3];    
        for(int i = 0; i < names.length; i++) {
            System.out.print("Please Enter Student name: ");
            names[i] =console.nextLine();
            temp[i] = names[i];
        }

        grade = new int[3];    
        for(int i =0;i<grade.length;i++) {
            System.out.print("Please Enter Student marks: ");
            grade[i] =console.nextInt();
        }          

        sortArray(names);     
    }

    private void sortArray(String[] arrayToSort) {
        Arrays.sort(arrayToSort);

        getIndex(arrayToSort);
    }

    private void getIndex(String[] sortedArray) {
        for(int x = 0; x < sortedArray.length; x++) {
            for(int y = 0; y < names.length; y++) {
                if(sortedArray[x].equals(temp[y])) {
                    System.out.println(sortedArray[x] + " " + grade[y]);
                }
            }
        }
    }
}
于 2012-09-06T17:41:38.713 に答える
0

List代わりにaを使用してください。その後、事前にサイズを宣言する必要はありません。サイズは動的に拡大できます。

本当に配列が必要な場合は、後でいつでもtoArray()メソッドを使用できます。List

于 2012-09-03T21:26:25.127 に答える
0

ソース配列を 2 回繰り返します。1 回目は、奇数と偶数の数を数えます。そこから、2 つの宛先配列のサイズがわかります。それらを作成し、ソース配列を介して 2 回目のパスを取得します。今回は、各値を適切な宛先配列にコピーします。

于 2012-09-03T22:52:05.247 に答える
0

リストを使用できない場合は、2回反復して偶数と奇数の数を数え、そのサイズで2つの配列を作成し、再度反復して各配列に数値を分散させることができますが、この解決策は遅くて醜いです.

すべての数字を含む同じ配列を 1 つだけ使用する別のソリューションを想像します。配列を並べ替えることができます。たとえば、左側に偶数を設定し、右側に奇数を設定します。次に、これらの 2 つの部分を分離した配列内の位置を持つ 1 つのインデックスがあります。同じ配列に、数値を持つ 2 つの部分配列があります。もちろん、効率的なソートアルゴリズムを使用してください。

于 2012-09-04T22:17:56.513 に答える