在本实验中,您将创建一个程序来合并两个非负(等于或大于 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/