我正在开发一个使用 Swing 的应用程序。我有一个 JTabbedPane,每个选项卡都被视为一个“页面”。每个页面包含 4 个普通面板(我将它们称为“视图”),它们按照 2x2 GridLayout 排列。
我想最小化页面的数量,所以每次删除视图时,我都想重新排序所有页面中的所有视图(如果更有意义,请考虑二维数组),以便靠近最后一页并从那里删除,并添加到更靠近前面的页面。
考虑这个例子:
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。想法是:当从长度到 0 的循环接近 0 时,它将检查数组的索引从0 到 length是空的。如果是这样,它将把非空元素放在包含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) + ")");
}
}
输出是:
排序前:(i = 0 j = 0 null = false) 排序前:(i = 0 j = 1 null = true) 排序前:(i = 0 j = 2 null = false) 排序前:(i = 0 j = 3 null = false) 排序前:(i = 1 j = 0 null = true) 排序前:(i = 1 j = 1 null = true) 排序前:(i = 1 j = 2 null = false) 排序前:(i = 1 j = 3 null = false) 排序前:(i = 2 j = 0 null = false) 排序前:(i = 2 j = 1 null = false) 排序前:(i = 2 j = 2 null = false) 排序前:(i = 2 j = 3 null = false) 排序后:(i = 0 j = 0 null = false) 排序后:(i = 0 j = 1 null = true) 排序后:(i = 0 j = 2 null = false) 排序后:(i = 0 j = 3 null = false) 排序后:(i = 1 j = 0 null = true) 排序后:(i = 1 j = 1 null = true) 排序后:(i = 1 j = 2 null = false) 排序后:(i = 1 j = 3 null = false) 排序后:(i = 2 j = 0 null = false) 排序后:(i = 2 j = 1 null = false) 排序后:(i = 2 j = 2 null = false) 排序后:(i = 2 j = 3 null = false)
完全相同的。我还尝试将compare(Object, Object)
实现替换为:
public int compare(Object a, Object b)
{
if (a == null && b != null)
{
return -1;
}
if (b == null && a != null)
{
return 1;
}
return 0;
}
...并取得了相同的结果。我有点不知所措。这不是我没有知识去做的事情,我只是无法思考如何为这样的问题实际创建解决方案。
我会很感激任何帮助。无论您喜欢哪种方式,循环方法或比较器方法,我都希望看到它!
谢谢!