无法合并两个已排序的用户输入数组

时间:2014-03-14 17:05:30

标签: java arrays sorting

编写一个代码,该代码应该从用户定义的长度的用户读取两个已经排序的数组,然后将它们排序为一个仍然排序的列表。出于某种原因,我不能让它排过前三位数?看起来它可能是一件非常简单的东西,我很想念但是我已经习惯了一段时间而没有找到任何东西。有什么想法吗?

Sample Run:

How long are the lists?: 3
Enter list A:
1: 1.0
2: 2.0
3: 3.0
Enter list B:
1: 2.0
2: 3.0
3: 4.0

Merged List: 1.0, 2.0, 2.0, 3.0, 3.0, 4.0

代码:

import java.util.Scanner; //import scanner


public class project2 {

public static void main (String[] args){

    Scanner input = new Scanner(System.in); //scanner for input

    int a = 0;

    System.out.println("How long are the lists? ");
    System.out.print("(The lists should be the same length):  ");
    a = input.nextInt();

    double [] lista = new double [a]; //create array
    double [] listb = new double [a]; //create array

    int count=1;
    System.out.println("Enter numbers for list A:");
    for(int j = 0; j < a ; j++){       //user input numbers loop into array "list"
        System.out.print(count + ": ");
        lista[j] = input.nextDouble();
        count++;
    }

    int acount = 1;
    System.out.println("Enter numbers for list B:");
    for(int j = 0; j < a ; j++){       //user input numbers loop into array "list"
        System.out.print(acount + ": ");
        listb[j] = input.nextDouble();
        acount++;
    }



    System.out.println(); // print the original lista inputed by user
    System.out.print("Your list A:   ");
    for(int j=0; j<a; j++){
        System.out.print(lista[j] + " ");
    }
    System.out.println(); // print the original listb inputed by user
    System.out.print("Your list B:   ");
    for(int j=0; j<a; j++){
        System.out.print(listb[j] + " ");
    }

    project2.merge(lista, listb);

    System.out.println(); // print the new merged listc
    System.out.print("Merged List:   ");
    for(int j=0; j<a; j++){
        System.out.print(project2.merge(lista, listb)[j] + ", ");
    }

}


public static double [] merge ( double [] list1, double [] list2){

double [] listc = new double [list1.length + list2.length]; //create array

 int i = 0, j = 0, k = 0;
    while (i < list1.length && j < list2.length)
    {
        if (list1[i] < list2[j])
        {
            listc[k] = list1[i];
            i++;
        }
        else
        {
            listc[k] = list2[j];
            j++;
        }
        k++;
    }

    while (i < list1.length)
    {
        listc[k] = list1[i];
        i++;
        k++;
    }

    while (j < list2.length)
    {
        listc[k] = list2[j];
        j++;
        k++;
    }



return listc;

}


}

3 个答案:

答案 0 :(得分:3)

您正在将两个长度为a的数组合并为一个长度为2 * a的数组,但您只打印出第一个a数字。修改打印出合并数组的for循环条件:

for(int j=0; j< 2*a; j++){

此外,每次调用merge时,都会再次合并数组。只需合并一次,然后在打印内容时引用该数组。此版本使用新的合并数组length来停止循环。

double[] listc = project2.merge(lista, listb);
System.out.println(); // print the new merged listc
System.out.print("Merged List:   ");
for(int j=0; j < listc.length; j++){
    System.out.print(merged[j] + ", ");
}

答案 1 :(得分:2)

提示:由于您将两个已排序的列表合并为一个(输出)排序列表,因此请考虑为输出列表的大小执行的循环...并将每个列表的下一个适当值放入下一个输出槽中。两个输入列表。

在该循环中,你想要比较什么,看看你接下来会得到什么值? 你会如何在另一个之前处理一个清单呢? 如何推广你的程序,这样两个输入列表的长度不需要相同?

(没有作业代码)

答案 2 :(得分:0)

为什么你不只是使用JDK方法java.util.Arrays#sort(double[])而不是重新发明轮子?