【问题标题】:Merging/Sorting My Array (Java)合并/排序我的数组(Java)
【发布时间】:2017-04-19 00:21:40
【问题描述】:

我需要做的是要求用户输入两个数组的值,然后分别输出它们,同时输出一个按升序排列的合并数组。

例如,如果用户为第一个数组输入 2,5,8,0,为第二个数组输入 6,7,0,则合并后的数组应输出 2,5,6,7,8。

我的前两个数组的输出工作完美,但合并后的数组总是输出零。我还添加了一个重启布尔值来查看用户是否想再试一次。请帮助我,因为我被卡住了。

我了解整个过程,但不确定如何将其实现到我的代码中。这是我的代码:

//import packages
import java.util.Scanner;
import java.lang.Math; 
import java.util.Arrays;

public class Main4{

public static void main(String[] args){

boolean doItAgain = true;//add boolean value to use when restarting progam

Scanner scan = new Scanner (System.in);//initialize new scanner

while(doItAgain){

//initialize variables
int first [] = new int[10000];//initialize to maximum of 10,000 integers
int second [] = new int[10000];//initialize to maximum of 10,000 integers
int input1; 
int input2; 
int counter1 = 0;//counter variable for first string
int counter2 = 0;//counter variable for second string


System.out.println("");
System.out.println("Welcome To my Merge Array Program 2.0!");
System.out.println("Enter the values for the first array, up to 10000 values, enter zero or a negative number to quit"); //asks user for first array input

//loop to go through each index
for (int a = 0; a<10000; a++) 
{ 
  input1 = scan.nextInt();//stores input as input1
  first [a] = input1; 
  counter1++; 
  if (input1<=0)
    break;//breaks out of loop if input1 value is 0 or below
}

int first2 []= new int [counter1-1]; 
for(int b = 0; b<first2.length; b++) { 
  first2 [b] = first[b]; 
} 


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

for (int j = 0; j<10000; j++)
{ 
  input2 = scan.nextInt();//stores input as input2
  second [j] = input2; 
  counter2++;
  if (input2<=0)
    break;//breaks out of loop if input1 value is 0 or below
}

int second2 []= new int [counter2-1]; 
for(int c = 0; c<second2.length; c++) { 
  second2 [c] = second[c]; 
} 

System.out.println("First Array:");//output first array values in the order of their input
for (int p=0; p<first2.length; p++) {
  System.out.print(first2[p] + " "); 
}
  System.out.println("\nSecond Array:");//output second array values in the order of their input
  for (int p2=0; p2<second2.length;p2++) { 
    System.out.print(second2[p2] + " "); 
  } 

  boolean valid = true; 
  for (int e = 0; e<first2.length-1; e++) { 
    if(first2[e]>first2[e+1]) { 
      valid = false; 
    }

  } 
  for (int e2 = 0; e2<second2.length-1;e2++) { 
    if(second2[e2]>second2[e2+1]) { 
      valid = false;
    } 
  }


  int[] array = new int[first2.length + second2.length];

  //fill array 3 with arrays 1 & 2
  for(int k = 0; k <first2.length;k++){
    array[k] = first2[k];
  }

  for (int l = 0; l<second2.length; l++){
    array[first2.length + l] = second2[l];
  }

  //sort array 3
  for (int i = 0; i<first2.length + 1; i++){
    for (int j = i+1; j<first2.length + 1; j++){

      if(array[i] > array[j]){
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
      }
    }
  }

  //output sorted merged array
  System.out.println("\nMerged Array: ");
  for(int p3 = 0; p3<array.length; p3++) {
    System.out.print(array[p3] + " "); 
  }

  //Asks user if they want to restart program. Used boolean value to initialize doItAgain variable
  System.out.println("");
  System.out.println("");
  System.out.println("Thanks for using this program! Do you want to do it again? (Y or N)");

  if(scan.next().toLowerCase().equals("y")){

    doItAgain = true;
    break;
  } 

  else{

    doItAgain = false;
    System.out.println("If you change your mind and want to run it again, type runMain.");//output closing statement if user says N to restart
    break;
  }
} 
} 
}

【问题讨论】:

  • 请不要这样编辑您的问题。对于以后可能会偶然发现它的人来说,这没有任何意义。

标签: java arrays merge


【解决方案1】:

您没有合并您的arrays。例如,您的第一个 array 是 [1 2],而您的第二个 array 是例如 [3 4]。您的最终数组将被初始化为大小 4 (first2.length + second2.length),但它的所有元素都将为零。

在这行这里,我建议你用arraycopy()来填写你最后的array

int[] array = new int[first2.length + second2.length];

System.arraycopy(first2, 0, array, 0, first2.length);
System.arraycopy(second2, 0, array, first2.length, second2.length);

这会将first2 数组复制到最终数组的起始位置,然后将second2 数组复制到最终数组first2 结束的位置。您最终会得到 [1 2 3 4],然后可以对元素进行排序(尽管在这种情况下,它们已经排序了。

有关arraycopy() 的更多信息,请在此处查看此页面: https://www.tutorialspoint.com/java/lang/system_arraycopy.htm

编辑:顺便说一句,您这里有一个错误,这就是阻止您打印完整排序数组的原因:

//output sorted merged array
System.out.println("\nMerged Array: ");
for(int p3 = 0; p3<array.length; p3++) {
    System.out.print(array[p3] + " ");
} //right here, you need to close this curly bracket

EDIT2:由于不能使用arraycopy(),所以可以使用for循环填充最终数组:

for(int k = 0; k <first2.length;k++){
    array[k] = first2[k];
}

for (int l = 0; l<second2.length;l++){
    array[first2.length + l] = second2[l];
}

【讨论】:

  • @JohnHughes 只需使用for 循环将最终数组的0 替换为其他两个数组(first2second2)中的元素。
  • @JohnHughes 4 个零在技术上是正确的,因为这是您的最终数组。使用我提到的for 循环,它会正常工作。 “是的重启”,你必须解决。
  • @JohnHughes 好吧,你认为你需要把它放在哪里才能填充最终的数组?有关这些for 循环的外观,请查看我的 EDIT2。另外,我建议您阅读 arraycopy() 文档以了解此过程的工作原理。
  • 这是一个完全不同的问题。我建议您现在尝试为自己做。看看一些简单的排序算法,如冒泡排序并尝试实现它们。
  • 我不允许使用冒泡排序。我发布了我更新的代码以进行排序,但仅部分有效。我错过了什么?
猜你喜欢
  • 2021-03-04
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
相关资源
最近更新 更多