【问题标题】:Merging 2 different integer arrays with same or different lengths into one big array and sorting them from least to greatest将 2 个长度相同或不同的整数数组合并为一个大数组,并将它们从最小到最大排序
【发布时间】:2018-08-13 19:26:48
【问题描述】:

在我的一个程序中,我无法合并两个不同的列表并将其放入一个数组中并从最小到最大排序。一位助教说我可以硬编码让它变得更容易,或者用更好的方式来做,很难做到。我想以更好的方式做到这一点,这样我就可以思考/变得更好地编码。助教说它在一个 for 循环中是可行的。现在已经思考和尝试了大约 5 个小时,然后放弃了。有什么建议?

import java.util.Scanner;

public class Lab10Part1 {

    public static void main(String[] args) {
        int[] list1, list2;

        Scanner input = new Scanner(System.in);
        System.out.print("Enter list1 size and contents: ");
        int len1 = input.nextInt();
        list1 = new int[len1];
        for(int i = 0; i < list1.length; i++) {
            list1[i] = input.nextInt();
        }

        System.out.print("Enter list2 size and contents: ");
        int len2 = input.nextInt();
        list2 = new int[len2];
        for(int i = 0; i < list2.length; i++) {
            list2[i] = input.nextInt();
        }

        input.close();

        System.out.print("List1 is ");
        for(int i = 0; i < list1.length; i++) {
            System.out.print(list1[i] + " ");
        }
        System.out.println();
        System.out.print("List2 is ");
        for(int i = 0; i < list2.length; i++) {
            System.out.print(list2[i] + " ");
        }

        System.out.println();
        System.out.print("The merged list is ");
        for(int i = 0; i < merge(list1, list2).length; i++) {
        System.out.print(merge(list1, list2)[i] + " ");
        }

    }

    public static int[] merge(int[] list1, int[] list2) {
        int[] merge = new int[list1.length + list2.length];
        int min = Math.min(list1.length, list2.length);

        for(int i = 0, j = 0, k = 0; i < merge.length; k++) {
            if (min <= list1.length || min <= list2.length) {
                if(list2[j] <= list1[i]) {
                    merge[k] = list2[j];
                    j++;
                }
                else {
                    merge[k] = list1[i];
                    i++;
                }
                min++;
            }


            else if(list2.length >= list1.length) {
                if(list1[i] <= list2[j]) {
                    merge[k] = list1[i];
                    i++;
                }
                else {
                    merge[k] = list2[j];
                    j++;
                }
            }


        }
        return merge;
    }

}

【问题讨论】:

  • 你应该将合并的结果存储在一个局部变量中。
  • 那么,我的逻辑和语法正确吗?我需要做的就是把 int[] merge;进入不同的 int 数组变量?
  • 我并没有真正深入阅读该方法中的代码,但在调用站点您应该执行int[] merge = merge(list1, list2) 之类的操作,而不是重复调用该方法。
  • list1 和 list2 是否保证已经排序?
  • @IanMc 不,用户可以输入他们想要的大小,并随机输入任何数字。

标签: java arrays sorting merge


【解决方案1】:

我认为你可以通过使用集合(只是List)来解决问题。Array to List的方法是Arrays.asList(array)。然后使用add和sort方法。你可以参考Java Collections api more.原谅我英语不好。

【讨论】:

    【解决方案2】:

    这是一种合并排序列表的方法,并在一个 for 循环中保持顺序:

    public class MergeSort {
    
    public static void main(String[] args) {
        int[] a1 = { 1, 5, 6 };
        int[] a2 = { 2, 4, 6, 9, 11 };
        int[] a3 = merge(a1,a2);
        for (int i = 0; i<a3.length; i++)
            System.out.printf("%d ", a3[i]);
        System.out.println();
    
    }
    public static int[] merge(int[] list1, int[] list2) {
        int[] merge = new int[list1.length + list2.length];
        int i = 0; // Array index for list1
        int j = 0; // Array index for list2
        for (int k = 0; k < merge.length; k++) {
            int v1 = (i < list1.length) ? list1[i] : Integer.MAX_VALUE;
            int v2 = (j < list2.length) ? list2[j] : Integer.MAX_VALUE;
            if (v1 < v2) {
                merge[k] = v1;
                i++;
            } else {
                merge[k] = v2;
                j++;
            }
        }
        return merge;
    }
    
    }
    

    创建输出:

    1 2 4 5 6 6 9 11 
    

    三元运算符的替代方案

    //int v1 = (i < list1.length) ? list1[i] : Integer.MAX_VALUE;
    int v1;
    if (i < list1.length)
        v1 = list1[i];
    else 
        v1 = Integer.MAX_VALUE;
    

    【讨论】:

    • “?”是什么意思?运算符是什么意思?
    • 是三元运算符。它是这样工作的。之前的表达式?被评估。如果为真,则将 v1 分配给紧接在 ? 之后的内容。如果为 false,则将 v1 分配给 : 之后的内容
    • 啊,所以在只有真假结果的情况下,比写if语句要好?
    • 这真的很酷。太感谢了!我在处理这段代码时遇到了很多麻烦,因为数组真的让我很困惑。尤其是二维数组。您有什么建议可以帮助您更轻松地进行编程吗?或者也许是建议?我知道坚持练习是关键,并且必须经历大量的试验和错误,但作为一名大学生,我正在尽我所能地投资学习编程。
    • 不客气。数组起初对每个人来说都很难。你试过这个:docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 2016-02-15
    • 1970-01-01
    • 2020-05-24
    • 2013-11-12
    • 2010-11-15
    • 1970-01-01
    相关资源
    最近更新 更多