[解決済み] オブジェクトのArrayListを独自のソート順で並べ替える
2022-08-13 20:58:23
質問
アドレス帳アプリケーションにソート機能を実装したいと考えています。
をソートしたいのですが
ArrayList<Contact> contactArray
.
Contact
は、名前、自宅の電話番号、携帯電話番号、住所の4つのフィールドを含むクラスです。私は、ソートするために
name
.
これを行うには、どのようにカスタムソート関数を書けばよいのでしょうか?
どのように解決するのですか?
オブジェクトの順序付けに関するチュートリアルです。
いくつか例を挙げますが、とにかく一読されることをお勧めします。
をソートする方法はいろいろあります。
ArrayList
. を定義したい場合
ナチュラル
(デフォルト)
順序付け
を指定する必要があります。
Contact
インプリメント
Comparable
. でデフォルトで並べ替えを行いたいと仮定すると
name
でソートしたい場合は、次のようにします(簡略化のためヌルチェックは省略します)。
public class Contact implements Comparable<Contact> {
private String name;
private String phone;
private Address address;
@Override
public int compareTo(Contact other) {
return name.compareTo(other.name);
}
// Add/generate getters/setters and other boilerplate.
}
を実行すればいいように
List<Contact> contacts = new ArrayList<Contact>();
// Fill it.
Collections.sort(contacts);
を定義したい場合
外部制御可能な順序
を定義したい場合 (これは自然な順序を上書きします)、そのためには
Comparator
:
List<Contact> contacts = new ArrayList<Contact>();
// Fill it.
// Now sort by address instead of name (default).
Collections.sort(contacts, new Comparator<Contact>() {
public int compare(Contact one, Contact other) {
return one.getAddress().compareTo(other.getAddress());
}
});
を定義することもできます。
Comparator
を定義することもできます。
Contact
を毎回再作成するのではなく、再利用できるようにします。
public class Contact {
private String name;
private String phone;
private Address address;
// ...
public static Comparator<Contact> COMPARE_BY_PHONE = new Comparator<Contact>() {
public int compare(Contact one, Contact other) {
return one.phone.compareTo(other.phone);
}
};
public static Comparator<Contact> COMPARE_BY_ADDRESS = new Comparator<Contact>() {
public int compare(Contact one, Contact other) {
return one.address.compareTo(other.address);
}
};
}
であり,以下のように使用できる.
List<Contact> contacts = new ArrayList<Contact>();
// Fill it.
// Sort by address.
Collections.sort(contacts, Contact.COMPARE_BY_ADDRESS);
// Sort later by phone.
Collections.sort(contacts, Contact.COMPARE_BY_PHONE);
そして、上からクリームを塗るために 汎用javabeanコンパレータ :
public class BeanComparator implements Comparator<Object> {
private String getter;
public BeanComparator(String field) {
this.getter = "get" + field.substring(0, 1).toUpperCase() + field.substring(1);
}
public int compare(Object o1, Object o2) {
try {
if (o1 != null && o2 != null) {
o1 = o1.getClass().getMethod(getter, new Class[0]).invoke(o1, new Object[0]);
o2 = o2.getClass().getMethod(getter, new Class[0]).invoke(o2, new Object[0]);
}
} catch (Exception e) {
// If this exception occurs, then it is usually a fault of the developer.
throw new RuntimeException("Cannot compare " + o1 + " with " + o2 + " on " + getter, e);
}
return (o1 == null) ? -1 : ((o2 == null) ? 1 : ((Comparable<Object>) o1).compareTo(o2));
}
}
で、以下のように使うことができます。
// Sort on "phone" field of the Contact bean.
Collections.sort(contacts, new BeanComparator("phone"));
(コードにあるように、ソート中のNPEを避けるために、NULLフィールドがすでにカバーされている可能性があります)
関連
-
java send https request prompt java.security.cert.について。
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] ArrayListの初期化を1行で行う。
-
[解決済み] List<T>をオブジェクトのプロパティでソートする方法
-
[解決済み] カスタムオブジェクトのArrayListをプロパティでソートする
-
[解決済み] Javaで「ArrayList<String>」を「String[]」に変換する。
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
-
[解決済み】オブジェクトの配列をプロパティ値でソートする
-
[解決済み】カスタムオブジェクトのベクターをソートする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
executeQuery()でデータ操作文が発行できない。解決方法
-
SLF4J: クラス・パスに複数のSLF4Jバインディングが含まれています。
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
Java appears タイプEを囲むインスタンスがアクセスできない。
-
代入の左辺は変数でなければならない 解答
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。
-
アクセス制限の解決方法: ---- in Java
-
ApiModel と @ApiModelProperty の使用法
-
WeChat小プログラム Bluetooth通信 Bluetoothモジュールデモ