1つの配列リストと1つの文字列配列があります。文字列配列にはIDが含まれ、配列リストにはIDとそれらのIDに関連する情報が含まれます。このArrayListは望ましくない順序になっています。ArrayListに含めるIDの文字列配列があります。
セミ擬似コードの例:
ArrayList<MyObject> myList = new ArrayList<MyObject>();
for (every username)
{
myList.add(new MyObject(id, username, content, country);
}
String[] ids = new String[myList.size()];
...Ids are added and sorted here...
これで、IDのリストが正しい順序で表示されます。「myList」の各IDは、「ids」文字列配列のIDに対応します。「ids」文字列配列内の対応するIDの順序に基づいて「myList」を並べ替えたいと思います。
このような方法でArrayListを並べ替えるにはどうすればよいですか?
Eg. if in Array list I have:
1. 123, Bob, test, USA
2. 1234, Vladimir, test, USA
3. 12345, Yoseph, test, USA
and in the String[] I have:
1. 1234
2. 123
3.12345
文字列配列のIDに基づいてArrayListを並べ替えると、次のようになります。
1. 1234, Vladimir, test, USA
2. 123, Bob, test, USA
3. 12345, Yoseph, test, USA
1つの解決策は、ids
配列を反復処理し、オブジェクトでid
配列内の現在の値を検索することです。最終的な(望ましい)位置がわかっています。これは配列内のインデックスであるため(リストを配列と同じように並べ替える必要があるため)、この要素をリスト内の最後の場所に移動できます(これは次のように交換します)。要素は、現在配列内にある位置にあります)。
for (int i = ids.length - 1; i > 0; i--) { // Downward for efficiency
final String id = ids[i];
// Big optimization: we don't have to search the full list as the part
// before i is already sorted and object for id can only be on the remaining
for (int j = i; j >= 0; j--) // NOTE: loop starting at i
if (id.equals(myList.get(j).getId()) {
Collections.swap(myList, j, i);
break;
}
}
注:他のすべての要素が配置されている場合、最後の要素も(その)位置にあるため、for
ループは最後の要素(i==0
)を省略します。
これは、コンパレータを作成して並べ替えアルゴリズムを使用するよりもはるかに高速です(Collections.sort()
たとえば、要素の順序はすでにわかっており(ids
配列によって定義されます)、並べ替えアルゴリズムは(アルゴリズムがどれほど賢くても)[less | equals | greater]
コンパレータから返される情報。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加