質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Java

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

Q&A

解決済

3回答

16840閲覧

【java】要素の型が自作クラスであるListでindexOfメソッドを使って検索を行いたい

aaaa__

総合スコア15

Java

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

0グッド

1クリップ

投稿2020/03/24 07:10

java

1public class Jisaku { 2 int a; 3 String b; 4 public Jisaku(int a, String b) { 5 this.a = a; 6 this.b = b; 7 } 8}

上のようなクラスを定義した後、メインクラスで要素の型をJisakuとしたListを用意し、リスト(jisakuList)にforを用いて値を入れていきました。

java

1public static void main(String[] args) { 2 List<Jisaku> jisakuList = new ArrayList<Jisaku>(); 3 4 for(int i = 0; i < 3; i++) { 5 Jisaku j = new Jisaku(i, "aaa"); 6 jisakuList.add(j); 7 } 8}

その後、リスト(jisakuList)のデータの中で、フィールドaの値が1であるデータの添え字を知りたいです。
リストの型がintなどの場合は、indexOf(1)とすれば値が取れることが分かったのですが、型が自作クラスである場合の特定の1フィールドで検索する方法を調べても中々見つからなかったので、その方法があればどなたかご教授いただきたいです><

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

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

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

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

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

Zuishin

2020/03/24 09:04

フィールド a のリストに変換すれば使えると思います。
guest

回答3

0

フィールドaの値を検索するindexOfメソッドを組み込めばいいのです

投稿2020/03/24 07:16

編集2020/03/24 07:20
y_waiwai

総合スコア88042

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

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

LouiS0616

2020/03/24 08:32

indexOfメソッドをどのクラスに組み込むのですか?
guest

0

次のように二段階を踏んでやるのが素直でしょう。
0. フィールドaの値が1であるJisakuインスタンスをリストから取得
0. indexOfメソッドに当該インスタンスを渡し、要素の位置を得る

特定の条件を満たす要素の取得

Stream API を使うのが最も楽なように思います。

Java

1Optional<Jisaku> foundOpt = jisakuList.stream() 2 .filter(e -> e.a == 1) 3 .findFirst() 4; 5 6if(!foundOpt.isPresent()) { 7 値が見つからないときの処理 8} 9else { 10 Jisaku found = foundOpt.get(); 11 ... 12}

要素が見つからなかったときの処理は、期待する結果に依ります。
添え字として -1 を得たいだけなのであれば、foundOpt.orElse(null) を利用するのも簡潔です。


よく分からなければfor文で書いても良いでしょう。

indexOfメソッドの利用

まず準備として、Jisakuクラスでequalsメソッドをオーバーライドします。
またそれに付随してhashCodeメソッドも適切に用意することが好ましいです。

例えば、こんなふうに。

Java

1 2class Jisaku { 3 final int a; // フィールドを公開するならせめてfinalにしましょう 4 final String b; 5 public Jisaku(int a, String b) { 6 this.a = a; 7 this.b = b; 8 } 9 10 @Override 11 public boolean equals(Object obj) { 12 if(!(obj instanceof Jisaku)) { 13 return false; 14 } 15 16 Jisaku other = (Jisaku)obj; 17 return Objects.equals(this.a, other.a) && Objects.equals(this.b, other.b); 18 } 19 20 @Override 21 public int hashCode() { 22 return Objects.hash(this.a, this.b); 23 } 24}

投稿2020/03/24 08:57

LouiS0616

総合スコア35668

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

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

0

ベストアンサー

ListのindexOfの実装は

(o==null ? get(i)==null : o.equals(get(i)))となる、最小のインデックスiを返します。

が基本なので、IntegerのequalsとJisakuがtrueになることは無いので、基本的にはできません。
自前で、以下のようなメソッドを用意するのが妥当かと思います。

java

1private static int mySearch(List<Jisaku> list, int target) { 2 for(int i = 0; i < list.size(); i++) { 3 if (list.get(i).a == target) return i; 4 } 5 return -1; 6}

jisakuList.indexOf(1)でなく、jisakuList.indexOf(new Jisaku(0, "xxx"))みたいな探しかたでよいなら
Jisakuクラスのequalsをオーバーライドすればよいです。
とはいえ、bの値を無視するequalsは微妙かと思います。

java

1public boolean equals(Object o) { 2 // ★重要★ equalsを実装する場合、hashCodeの実装も必要 3 if(o != null && o instanceof Jisaku) { 4 // a が 同じならequal 5 return ((Jisaku)o).a == this.a; 6 } 7 return false; 8} 9

あとは、y_waiwaiさんの回答にあるように、indexOfを実装する方法があります。

java

1public static void main(String[] args) { 2 List<Jisaku> jisakuList = new ArrayList<Jisaku>() { 3 @Override 4 public int indexOf(Object o) { 5 Integer target = null; 6 if (o instanceof Jisaku) { 7 target = ((Jisaku) o).a; 8 } else if (o instanceof Integer) { 9 target = (Integer) o; 10 } 11 12 for (int i = 0; i < size(); i++) { 13 // if (o == null ? get(i) == null : o.equals(get(i))) 14 if (o == null ? get(i) == null : get(i).a == target) 15 return i; 16 } 17 18 return -1; 19 } 20 }; 21 22 for (int i = 0; i < 3; i++) { 23 Jisaku j = new Jisaku(i, "aaa"); 24 jisakuList.add(j); 25 } 26 27 System.out.println(jisakuList.indexOf(new Jisaku(0, "other"))); 28 System.out.println(jisakuList.indexOf(2)); // コンパイラが警告だすよ 29 30 jisakuList.add(null); 31 System.out.println(jisakuList.indexOf(null)); 32} 33

投稿2020/03/24 08:42

momon-ga

総合スコア4826

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

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

aaaa__

2020/03/25 07:04

とても参考になりました。ありがとうございます。 他の方からもコード付きのわかりやすい回答をいただきましたが、ほとんどこちらを参考に解決したのでベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問