質問するログイン新規登録
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

2回答

388閲覧

JavaでObjectのNullを含むArrayのsort

bobo

総合スコア48

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2025/02/27 06:46

0

0

実現したいこと

ArrayでObjectがNullも含んだ場合のソートを実現したい

発生している問題・分からないこと

以下で、ソートは出来ると思います。

var list = [{id: 1, nm: 'a'},{id: 2, nm: 'b'},{id: 3, nm: 'c'}];//分かりやすくJSON形式にしてます。
list.sort(Comparator.comparing(TestDto::getId));

また、当該の値がNullの場合でも以下の様に指定すればNullpointerExceptionが発生することは無いと思います。
var list = [{id: 1, nm: 'a'},{id: 2, nm: 'b'},{id: null, nm: 'c'}];
list.sort(Comparator.comparing(TestDto::getId, Comparator.nullsLast(Comparator.naturalOrder())));

該当のソースコード

java

1list.sort(Comparator.comparing(TestDto::getId, Comparator.nullsLast(Comparator.naturalOrder())));

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

ただ、↓の様にListにaddされたObjectそのものがnullだった場合、どう回避すればよいでしょうか?
var list = [{id: 1, nm: 'a'},{id: 2, nm: 'b'},null];

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

utm.

2025/02/27 06:54

Nullを除外した新しいリストをコピーして並び替えてからNullを挿入すればいいだけでは?
melian

2025/02/27 07:20

以下の回答の様に custom Comparator を定義してもよいかと思います。 How to sort an array of objects containing null elements? https://stackoverflow.com/a/27556168
jimbe

2025/02/27 09:12 編集

単に Comparator.comparing ありきで難しく考えてしまっているだけのようにも見えます。 >//分かりやすくJSON形式にしてます。 動くコードを出されたほうが良いと思いますが。 そして null があった場合どのような結果になって欲しいのでしょうか。 (DBからのオブジェクトを想定のようですが、 id が null というのは良いのでしょうか?) それと一応、java で List は Array ではありません。
guest

回答2

0

自然順序(Comparator.naturalOrder()) を使うなら TestDtoComparable を implements してそちらで id=null の場合の並びを制御するのが妥当では無いでしょうか。
そしたら後は Comparator.nullsLast と組み合わせるだけです。

java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) throws Exception { 5 List<TestDto> list = new ArrayList<>(Arrays.asList(new TestDto(2,"b"), null, new TestDto(null,"c"), new TestDto(1,"a"))); 6 System.out.println("init. : "+list); 7 8 list.sort(Comparator.nullsLast(Comparator.naturalOrder())); //自然順序(null は後ろ) 9 10 System.out.println("sorted: "+list); 11 } 12} 13 14class TestDto implements Comparable<TestDto> { 15 private Integer id; 16 private String nm; 17 18 TestDto(Integer id, String nm) { 19 this.id = id; 20 this.nm = nm; 21 } 22 23 int getId() { return id; } 24 String getNm() { return nm; } 25 26 //自然順序 27 @Override 28 public int compareTo(TestDto o) { 29 if(id == null || o.id == null) return id == o.id ? 0 : id == null ? 1 : -1; //id=null は後ろ 30 return id.compareTo(o.id); 31 } 32 33 @Override 34 public int hashCode() { 35 return Objects.hash(id, nm); 36 } 37 @Override 38 public boolean equals(Object other) { 39 if(other == null) return false; 40 if(other == this) return true; 41 if(!(other instanceof TestDto)) return false; 42 TestDto o = (TestDto)other; 43 return (id==null?o.id==null:id.equals(o.id)) && 44 (nm==null?o.nm==null:nm.equals(o.nm)); 45 } 46 @Override 47 public String toString() { 48 return getClass().getSimpleName()+"[id="+id+",nm="+nm+"]"; 49 } 50}
init. : [TestDto[id=2,nm=b], null, TestDto[id=null,nm=c], TestDto[id=1,nm=a]] sorted: [TestDto[id=1,nm=a], TestDto[id=2,nm=b], TestDto[id=null,nm=c], null]

投稿2025/02/27 12:20

編集2025/02/27 12:36
jimbe

総合スコア13361

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

  1. idがnullではないTestDTO
  2. idがnullのTestDTO
  3. null

この順番でソートしたいということでしょうか? Comparatorを自作したほうが良いとは思いますが、Comparator.comparingを利用する思想を受け継ぐなら、以下のように実装すれば実現できると思います。

java

1list.sort( 2 Comparator.comparing( 3 (TestDTO o) -> o == null ? null : 1, 4 Comparator.nullsLast(Comparator.naturalOrder()) 5 ).thenComparing( 6 Comparator.comparing( 7 (TestDTO o) -> o == null ? null : o.getId(), 8 Comparator.nullsLast(Comparator.naturalOrder()) 9 ) 10 ) 11);

投稿2025/02/27 11:59

neko_the_shadow

総合スコア2395

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問