Swing を使用するアプリケーションに取り組んでいます。JTabbedPane があり、各タブは「ページ」と見なされます。各ページには、2x2 GridLayout に従って配置された 4 つの通常のパネル (「ビュー」と呼びます) が含まれています。
ページの量を最小限に抑えたいので、ビューが削除されるたびに、すべてのページのすべてのビューを再ソートして (より理にかなっている場合は 2 次元配列を考えてください)、ビューが最後のページに表示され、そこから削除され、先頭に近いページに追加されます。
次の例を検討してください。
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 },
};
array.length
最初は、0 から へのループとから 0 へのループの 2 つのループを使用することをarray.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) + ")");
}
}
出力は次のとおりです。
ソート前: (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;
}
...そして同じ結果を達成しました。私はちょっと途方に暮れています。これは私が知識を持っていないということではありません。このような問題の解決策を実際に作成する方法について頭を悩ませることはできません。
助けていただければ幸いです。ループ方式とコンパレータ方式のどちらのアプローチを好む場合でも、ぜひご覧ください。
ありがとう!