java - Java 中的合并数组赋值

标签 java arrays merge variable-assignment

在本实验中,您将创建一个程序来合并两个非负(等于或大于 0)整数数组。您的程序将接受每个数组作为来自键盘的输入。您事先不知道将输入多少个值,但您可以假设每个数组的最大长度为 10,000 个元素。要停止输入值,请输入负数。您可以忽略任何负数输入,并且不将它们存储在数组中。 两个输入数组的元素应按升序排列。换句话说,每个数组元素的值必须大于或等于前一个元素的值。数组可能包含重复的元素。 输入两个数组后,程序必须检查以确保每个数组的元素已按顺序输入。如果发现无序元素,则打印消息“错误:数组顺序不正确”。 您的任务是将两个输入数组合并为一个新数组,所有元素按从最低到最高的顺序排列。打印出输入的每个原始数组,然后打印出合并后的数组。 请注意,您的程序输出的数组必须在每个数字之间恰好有一个空格。

我的问题出现在我的代码末尾。由于某种原因,它不会以正确的顺序合并更复杂的数组。它适用于 {1, 3, 5} 和 {2, 4, 6} --> {1, 2, 3, 4, 5, 6} 等数组,但不适用于其他数组。我手工计算了一下,发现结果应该是正确的。谁能看到我的错误以及如何修复它?

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        int one[]= new int[10000];  //Original array with specified index
        int two[]= new int[10000];  //Original array with specified index

        int lengthShort=0;          //initializes the length of the shorter of the two arrays
                                    //either mergeOne or mergeTwo

        int lengthLong=0;           //initializes the length of the longer of the two arrays
                                    //either mergeOne or mergeTwo



        int a =0;                   //Initialize the count variable for array one
        int b =0;                   //Initialize the count variable for array two
    //STEP A
        System.out.println("Enter the values for the first array, "
                + "up to 10000 values, enter a negative number to quit");

        //This loop sets up for the creation of a new array for the first array
        //without all the null values.
        for(int i=0; i<one.length; i++){

            one[i] = scan.nextInt();
            a++;
            if(one[i]<0){
                one[i]=0;
                break;
            }
        }
        int length1 = a-1;

        System.out.println("Enter the values for the second array, "
                + "up to 10000 values, enter a negative number to quit");
        //This loop sets up for the creation of a new array for the second array
        //without all the null values.
        for(int i=0; i<two.length; i++){

            two[i] = scan.nextInt();
            b++;
            if(two[i]<0){
                two[i]=0;
                break;
            }

        }

        int lengthTwo = b-1;

    //STEP B
        int mergeOne[] = new int[length1];  //new array initialized without null values

        for (int i = 0; i<mergeOne.length; i++){
            mergeOne[i]=one[i];
        }
        int mergeTwo[] = new int[lengthTwo];    //new array initialized without null values

        for (int i = 0; i<mergeTwo.length; i++){
            mergeTwo[i]=two[i];
        }

        //After new arrays without null values created, I print out the inputed arrays.
        System.out.println("First Array:");

        for(int i=0; i<mergeOne.length; i++){
        System.out.print(mergeOne[i] + " ");
        }

        //After new arrays without null values created, I print out the inputed arrays.
        System.out.println("\nSecond Array:");

        for(int i=0; i<mergeTwo.length; i++){
        System.out.print(mergeTwo[i] + " ");
        }

    //STEP C
        //Because the for loop below runs into the Error out of Bounds statement
        //(merged.length goes beyond the length of either mergeOne or mergeTwo)
        //I'm going to create an integer for the length of the shortest array
        //(Ex. MergeOne<MergeTwo, so tempLength = MergeOne.length).
        //This will fill the merged array part way.  Then I should probably
        //create another for loop starting at tempLength and going to MergeTwo.length
        //to complete the merge array.  Hopefully this works.
        if(mergeOne.length<=mergeTwo.length){
            lengthLong = mergeTwo.length;
            lengthShort = mergeOne.length;
        }

        else if(mergeOne.length>=mergeTwo.length){
            lengthShort = mergeTwo.length;
            lengthLong = mergeOne.length;
        }

        int merged[] = new int[length1 + lengthTwo];


        for(int i = 0; i<lengthShort; i++){
            if(i==0){
                if(mergeOne[i]<=mergeTwo[i]){
                    merged[i] = mergeOne[i];
                    merged[i+1] = mergeTwo[i];
                }
                else if(mergeTwo[i]<=mergeOne[i]){
                    merged[i] = mergeTwo[i];
                    merged[i+1]= mergeOne[i];
                }
            }
            else if(i>0){
                if(mergeOne[i]<=mergeTwo[i]){
                    merged[i+i] = mergeOne[i];
                    merged[i+i+1] = mergeTwo[i];
                }
                else if(mergeTwo[i]<=mergeOne[i]){
                    merged[i+i] = mergeTwo[i];
                    merged[i+i+1]= mergeOne[i];
                }
            }
        }
        //If mergeOne.length equals mergeTwo.length, it skips over next step.
        if(mergeOne.length<mergeTwo.length){
            for(int k=lengthShort; k<lengthLong; k++){
                merged[k]=mergeTwo[k];
            }
        }
        //If mergeOne.length equals mergeTwo.length, it skips over next step.
        if(mergeOne.length>mergeTwo.length){
                for(int k=lengthShort; k<lengthLong; k++){
                    merged[k]=mergeOne[k];
            }
        }

    //STEP D
        //This is supposed to sort the final merged array.
        for(int i = 0; i<merged.length; i++){
            if((i+1)==merged.length)        //Prevents an ErrorOutofBounds message
                break;
            if(merged[i]>merged[i+1]){
                int temp = merged[i+1];
                merged[i+1]=merged[i];
                merged[i]= temp;

            }
        }

        System.out.println("Merged array in order is: ");

        for(int i = 0; i<merged.length; i++){
        System.out.print(merged[i] + " ");
        }
    }
    }

}

最佳答案

import java.util.Scanner;

public class Main {

//I typed your code in, and I think you just used an extra { at the end.
//When you remove it, it works out just fine. 
//I fixed it here and it works perfectly for me.


public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);

    int one[]= new int[10000];  //Original array with specified index
    int two[]= new int[10000];  //Original array with specified index

    int lengthShort=0;          //initializes the length of the shorter of the two arrays
                                //either mergeOne or mergeTwo

    int lengthLong=0;           //initializes the length of the longer of the two arrays
                                //either mergeOne or mergeTwo



    int a =0;                   //Initialize the count variable for array one
    int b =0;                   //Initialize the count variable for array two
//STEP A
    System.out.println("Enter the values for the first array, "
            + "up to 10000 values, enter a negative number to quit");

    //This loop sets up for the creation of a new array for the first array
    //without all the null values.
    for(int i=0; i<one.length; i++){

        one[i] = scan.nextInt();
        a++;
        if(one[i]<0){
            one[i]=0;
            break;
        }
    }
    int length1 = a-1;

    System.out.println("Enter the values for the second array, "
            + "up to 10000 values, enter a negative number to quit");
    //This loop sets up for the creation of a new array for the second array
    //without all the null values.
    for(int i=0; i<two.length; i++){

        two[i] = scan.nextInt();
        b++;
        if(two[i]<0){
            two[i]=0;
            break;
        }

    }

    int lengthTwo = b-1;

//STEP B
    int mergeOne[] = new int[length1];  //new array initialized without null values

    for (int i = 0; i<mergeOne.length; i++){
        mergeOne[i]=one[i];
    }
    int mergeTwo[] = new int[lengthTwo];    //new array initialized without null values

    for (int i = 0; i<mergeTwo.length; i++){
        mergeTwo[i]=two[i];
    }

    //After new arrays without null values created, I print out the inputed arrays.
    System.out.println("First Array:");

    for(int i=0; i<mergeOne.length; i++){
    System.out.print(mergeOne[i] + " ");
    }

    //After new arrays without null values created, I print out the inputed arrays.
    System.out.println("\nSecond Array:");

    for(int i=0; i<mergeTwo.length; i++){
    System.out.print(mergeTwo[i] + " ");
    }

//STEP C
    //Because the for loop below runs into the Error out of Bounds statement
    //(merged.length goes beyond the length of either mergeOne or mergeTwo)
    //I'm going to create an integer for the length of the shortest array
    //(Ex. MergeOne<MergeTwo, so tempLength = MergeOne.length).
    //This will fill the merged array part way.  Then I should probably
    //create another for loop starting at tempLength and going to MergeTwo.length
    //to complete the merge array.  Hopefully this works.
    if(mergeOne.length<=mergeTwo.length){
        lengthLong = mergeTwo.length;
        lengthShort = mergeOne.length;
    }

    else if(mergeOne.length>=mergeTwo.length){
        lengthShort = mergeTwo.length;
        lengthLong = mergeOne.length;
    }

    int merged[] = new int[length1 + lengthTwo];


    for(int i = 0; i<lengthShort; i++){
        if(i==0){
            if(mergeOne[i]<=mergeTwo[i]){
                merged[i] = mergeOne[i];
                merged[i+1] = mergeTwo[i];
            }
            else if(mergeTwo[i]<=mergeOne[i]){
                merged[i] = mergeTwo[i];
                merged[i+1]= mergeOne[i];
            }
        }
        else if(i>0){
            if(mergeOne[i]<=mergeTwo[i]){
                merged[i+i] = mergeOne[i];
                merged[i+i+1] = mergeTwo[i];
            }
            else if(mergeTwo[i]<=mergeOne[i]){
                merged[i+i] = mergeTwo[i];
                merged[i+i+1]= mergeOne[i];
            }
        }
    }
    //If mergeOne.length equals mergeTwo.length, it skips over next step.
    if(mergeOne.length<mergeTwo.length){
        for(int k=lengthShort; k<lengthLong; k++){
            merged[k]=mergeTwo[k];
        }
    }
    //If mergeOne.length equals mergeTwo.length, it skips over next step.
    if(mergeOne.length>mergeTwo.length){
            for(int k=lengthShort; k<lengthLong; k++){
                merged[k]=mergeOne[k];
        }
    }

//STEP D
    //This is supposed to sort the final merged array.
    for(int i = 0; i<merged.length; i++){
        if((i+1)==merged.length)        //Prevents an ErrorOutofBounds message
            break;
        if(merged[i]>merged[i+1]){
            int temp = merged[i+1];
            merged[i+1]=merged[i];
            merged[i]= temp;

        }
    }

    System.out.println("\nMerged array in order is: ");

    for(int i = 0; i<merged.length; i++){
    System.out.print(merged[i] + " ");
    }
}
}

关于java - Java 中的合并数组赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33884480/

相关文章:

java - java中Connection对象的使用

c - 这个数组错误是什么意思?

python - 如何有效地连接 numpy 中的许多 arange 调用?

sql - 多表插入与合并?

git - merge 可以更改分支的提交历史吗?

r - 如何按R中两列中的名称聚合?

java - 哪个 Java API 与 JavaCV 一起使用? org.bytedeco.opencv.opencv_core 还是 org.opencv.core?

java - 如何在android中根据Chapter wise阅读所有内容

java - "synchronized(this)"与 Java 中的 "synchronized((BaseClass)this)"?

javascript - 如果值不存在,则将数组对象插入另一个数组对象