【问题标题】:2 way merge in java if arrays have elements with repetition如果数组具有重复的元素,则在Java中进行2种合并
【发布时间】:2020-08-27 13:04:41
【问题描述】:

所以我一直在尝试合并 2 个预排序数组并将其变成 1 个排序数组。现在预排序的数组有重复的元素。这是我所拥有的

public class TwoWayMerge {
    public void merge(int[]a,int m,int[]b,int n)
    {
        //a=50,50,50,87,88
        //b=10,20,50,89,89,120
        //m=5 length of a
        //n=6 length of b
        //c is new array
        int i=0,j=0,k=0;
        int[]c=new int[m+n];
        while(i<m && j<n && k<m+n )
        {
            if(i<m && j<n && k<m+n && a[i]<=b[j])
            {
                c[k]=a[i];
                i=i+1;
            }
            if(i<m && j<n && k<m+n && b[j]<=a[i])
            {
                c[k]=b[j];
                j=j+1;
            }
            k=k+1;
        }


        if(i==m-1)
        {
            while(j<n && k<m+n )
            {
                c[k]=b[j];
                k++;
                j++;
            }
        }
        if(j==n-1)
        {
            while(i<m && k<m+n)
            {
                c[k]=a[i];
                k++;
                i++;
            }

        }
        for(i=0;i<m+n;i++)
        {
            System.out.print(c[i]+" ");
        }

    }

    public static void main(String[] args) {

        TwoWayMerge obj=new TwoWayMerge();
        int[] a= {50,50,50,87,88};//i4
        int[] b= {10,20,50,89,89,120};//j5
        obj.merge(a,5,b,6);

    }

}

现在在这一步

a[i]<=b[j]
b[j]<=a[i]

将执行两次,我只得到 3 个“50”而不是 4 个,因为我们在两个数组中有共同的元素,它们也有重复。

我的输出

10 20 50 50 50 87 88  0 0 0

预期输出

10 20 50 50 50 50 87 88 89 89 120

卡在这里,需要建议。

感谢阅读。

【问题讨论】:

  • 请提供完整的minimal-reproducible-example。目前您的代码存在编译时错误。初始化你评论过的变量,把你的输出和预期的输出。
  • 是的,但回答者可能需要在发布之前验证他们的解决方案。为此,您需要发布可以编译的代码。

标签: java arrays sorting merge


【解决方案1】:

在您的代码中,您到达了数组 a 的末尾并且您的循环终止了。

int[] a = {50, 50, 50, 87, 88};
int[] b = {10, 20, 50, 89, 89, 120};
int m = 5;
int n = 6;
int i = 0, j = 0, k;
int[] c = new int[m + n];

for (k = 0; k < m + n && i < m && j < n; k++) {
    if (a[i] <= b[j]) {
        c[k] = a[i++];
    } else {
        c[k] = b[j++];
    }
}
for (; i < m; i++) {
    c[k++] = a[i];
}
for (; j < n; j++) {
    c[k++] = b[j];
}
System.out.println(Arrays.toString(c));
// [10, 20, 50, 50, 50, 50, 87, 88, 89, 89, 120]

您需要两个额外的循环,迭代ab 的剩余元素(如果有)。


旁注:

if(i<m && j<n && k<m+n && a[i]<=b[j])

这里不需要再次检查循环条件。您可以将其简化为:

if (a[i] <= b[j])

经过你的修改,我可以看出你的问题很简单:

if(j==n-1)

这里,如果j 在第一位呢?

例子

a = {1, 2, 3, 4, 5};
b = {6, 7, 8, 9};

您的j 将是0。您需要将相同的条件更改为:

if (j <= n - 1)

i 也是如此。

【讨论】:

  • 我完全删除了 if 条件,现在代码可以工作了,谢谢
猜你喜欢
  • 2015-08-05
  • 2017-03-12
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多