0

条件:

  1. 両方の配列が正しい順序である必要があります またはエラー メッセージ
  2. 最初の配列は 2 番目の配列と同じかそれ以上の長さでなければならない、またはエラー メッセージ
  3. 1 番目が 2 番目よりも長い場合は、最初の印刷を続行する必要があります。

例: setF[] = 1,2,3,4,8 および setS[] =5,6,7 とすると、1, 5, 2, 6, 3, 7, 4, 8 が出力されます。

私のコードの問題: 正常に印刷され交互に表示されますが、最初の領域が長い場合は印刷されません。

完全なコード (少し乱雑なフォーマットで申し訳ありません。Web サイトで少しおかしくなっています):

package mergearrays;
import java.io.*;
import java.lang.*;
import java.util.*;

public class MergeArrays {
public static void main(String[] args) {
    //variables
    boolean done = false;
    boolean error = false;
    int inpval = 0;
    int i = 0; //will be setF.length
    int j = 0; //will be setS.length
    //arrays
    int [] vals = new int[20000]; 

    //ask user
    System.out.println("Enter the values for the first array, up to 10000      values, enter zero or a negative number to quit");

    //input array
    Scanner scan = new Scanner(System.in);
    while(!done) {
        inpval = scan.nextInt();
        if (inpval > 0) {
            vals[i] = inpval;
            i++;
        }
        else {
            done = true;
        }
    }
    done = false;
    System.out.println("Enter the values for the second array, up to 10000 values, enter zero or a negative number to quit");
    while(!done) {
        inpval = scan.nextInt();
        if (inpval > 0) {
            vals[j+i+1] = inpval;
            j++;
        }
        else {
            done = true;
        }
    }
    //new arrays
    int [] setF = new int[10000];
    int [] setS = new int[10000];

    //copy vals into setF and setS
    System.arraycopy(vals, 0, setF, 0, i);
    System.arraycopy(vals, i+1, setS, 0, i+j+1);

    //check for order
    for (int p = 0; p < i - 1; p++) {
        if (setF[p] > setF[p+1]) {
            error = true;
        break;
        }
    }
    for (int b = 0; b < j - 1; b++) {
        if (setS[b] > setS[b+1]) {
             error = true;
        break;
        }
    }
    //print first array
    System.out.print("\n First Array: ");
    for(int q = 0; q < i; q++) {
        System.out.print(setF[q] + " ");
    }
    //print second array
    System.out.print("\n Second Array: ");
    for(int m = 0; m < j; m++) {
        System.out.print(setS[m] + " ");
    }

    //print the final set
    if(i >= j && error == false){
        System.out.print("\n Merged Array: ");
        for(int n = 0; n <= i+j; n++) {
            if(setF[n] != 0 && setS[n] !=0) {
                if(n <= j) {
                    System.out.print(setF[n] + " ");
                    System.out.print(setS[n] + " ");
                }
                else if(n > j && n <= i){
                    System.out.print(setF[n] + " ");
                }
            }
        }
    }
    //error message
    else {
        System.out.print("\n ERROR: Array not in correct order");
      }
  }
}
4

1 に答える 1

1

最初の配列が長い場合に出力されなかった理由は、次のコード行にあります。

if (setF[n] != 0 && setS[n] != 0) {

同じ位置にある両方の配列がゼロの場合にのみ、印刷を続けました。ここでは「AND」ではなく「OR」をチェックする必要があります。さらに、その条件を「OR」に変更した後、インデックスが正しくないため、内部の ifs も変更する必要があります。次のように:

System.out.print("\n Merged Array: ");
for (int n = 0; n <= i + j; n++) {
    if (setF[n] != 0 || setS[n] != 0) {
        if (n < j) {
            System.out.print(setF[n] + " ");
            System.out.print(setS[n] + " ");
        } else if (n < i) {
            System.out.print(setF[n] + " ");
        }
    }
}

別の方法で解決できたはずです。助けが必要な場合は、ご案内できます。とにかく、これが役に立てば幸いです...

于 2016-12-01T10:59:47.937 に答える