gpt4 book ai didi

Java:带有对象和空值的 Arrays.sort(...)

转载 作者:行者123 更新时间:2023-12-01 19:04:31 25 4
gpt4 key购买 nike

我正在开发一个使用 Swing 的应用程序。我有一个 JTabbedPane,每个选项卡都被视为一个“页面”。每个页面包含 4 个普通面板(我将它们称为“ View ”),它们根据 2x2 GridLayout 排列。

我想最大限度地减少页面数量,因此每次删除 View 时,我都想对所有页面上的所有 View 重新排序(如果更有意义,请考虑二维数组),以便靠近最后一页的 View 并从那里删除,并添加到靠近前面的页面。

考虑这个例子:

Object[][] array = new Object [][] {

{ new Object(), null, new Object(), new Object() },
{ null, null, new Object(), new Object() },
{ new Object(), new Object(), new Object(), new Object() }

};

如何对该数组进行排序,使其看起来更像:

Object[][] array = new Object[][] {

{ new Object(), new Object(), new Object(), new Object() },
{ new Object(), new Object(), new Object(), new Object() },
{ new Object(), null, null, null },

};

一开始,我想到使用两个循环,一个从 0 到 array.length ,另一个从 array.length 到 0。这个想法是:当从 length 到 0 的值接近 0 时,它会检查从 0 到 length 的数组索引是否为空。如果是这样,它会将非 null 元素放置在包含 null 的索引中。

由于所有的循环,这种方法让我很头疼,所以我向我的一位密友寻求建议。他提出了一个更优雅的解决方案:Arrays.sort(Object[][], Comparator)

此代码的结果是:

    Object[][] array = new Object[][] { { new Object(), null, new Object(), new Object() }, { null, null, new Object(), new Object() }, { new Object(), new Object(), new Object(), new Object() } };

for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
System.out.println("Before sorting: (i = " + i + " j = " + j + " null = " + (array[i][j] == null) + ")");
}
}

Arrays.sort(array, new Comparator<Object>()
{

public int compare(Object a, Object b)
{
return a == null ? (b == null ? 0 : -1) : (b == null ? 1 : 0);
}

});

for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
System.out.println("After sorting: (i = " + i + " j = " + j + " null = " + (array[i][j] == null) + ")");
}
}

输出为:

Before sorting: (i = 0 j = 0 null = false)Before sorting: (i = 0 j = 1 null = true)Before sorting: (i = 0 j = 2 null = false)Before sorting: (i = 0 j = 3 null = false)Before sorting: (i = 1 j = 0 null = true)Before sorting: (i = 1 j = 1 null = true)Before sorting: (i = 1 j = 2 null = false)Before sorting: (i = 1 j = 3 null = false)Before sorting: (i = 2 j = 0 null = false)Before sorting: (i = 2 j = 1 null = false)Before sorting: (i = 2 j = 2 null = false)Before sorting: (i = 2 j = 3 null = false)After sorting: (i = 0 j = 0 null = false)After sorting: (i = 0 j = 1 null = true)After sorting: (i = 0 j = 2 null = false)After sorting: (i = 0 j = 3 null = false)After sorting: (i = 1 j = 0 null = true)After sorting: (i = 1 j = 1 null = true)After sorting: (i = 1 j = 2 null = false)After sorting: (i = 1 j = 3 null = false)After sorting: (i = 2 j = 0 null = false)After sorting: (i = 2 j = 1 null = false)After sorting: (i = 2 j = 2 null = false)After sorting: (i = 2 j = 3 null = false)

Exactly the same.I have also tried replacing the compare(Object, Object) implementation with:

        public int compare(Object a, Object b)
{
if (a == null && b != null)
{
return -1;
}
if (b == null && a != null)
{
return 1;
}
return 0;
}

...并取得了相同的结果。我有点不知所措。这不是我不具备知识去做的事情,我只是无法思考如何为这样的问题实际创建解决方案。

如果有任何帮助,我将不胜感激。无论您喜欢哪种方式,循环方法还是比较器方法,我都很乐意看到它!

谢谢!

最佳答案

你的意思是

Object[][] array = new Object [][] { .. };

在您的情况下,您需要将二维数组转换为数组(一维数组)。对新数组进行排序后,用排序后的数组填充二维数组。

// convert to 1-D array
Object[] all = new Object[12];
int k = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
all[k++] = array[i][j];
}
}

// then sort the new array
Arrays.sort(all, yourComparator);

// then fill the 2-D array with the sorted array
k = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
array[i][j] = all[k++];
}
}

关于Java:带有对象和空值的 Arrays.sort(...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10629089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com