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

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

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

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

解決済

Java8のstreamで、自作オブジェクトのListの並べ替えをしたい

omodai
omodai

総合スコア10

Java

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

2回答

0評価

0クリップ

472閲覧

投稿2017/07/13 09:57

編集2017/07/13 10:49

###前提・実現したいこと
Java8のStreamを使用して自作オブジェクトのListの並べ替えをしたいと考えています
テストとして、PersonクラスとSectionクラス、その二つを持っているInfoクラスを作りました

  • Personクラス

java

package sorttest; public class Person { String firstName; String lastName; int age; public Person(String firstName, String lastName, int age) { this.firstName = firstName; this.lastName = lastName; this.age = age; } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } public int getAge() { return age; } @Override public String toString() { return "Person{" + "firstName=" + firstName + ", lastName=" + lastName + ", age=" + age + '}'; } }
  • Sectionクラス

java

package sorttest; public class Section { String sectionCode; String sectionName; public Section(String sectionCode, String sectionName) { this.sectionCode = sectionCode; this.sectionName = sectionName; } public String getSectionCode() { return sectionCode; } public String getSectionName() { return sectionName; } @Override public String toString() { return "Section{" + "sectionCode=" + sectionCode + ", sectionName=" + sectionName + '}'; } }
  • Infoクラス

java

package sorttest; public class Info { Person person; Section section; public Info(Person person, Section section) { this.person = person; this.section = section; } public Person getPerson() { return person; } public Section getSection() { return section; } @Override public String toString() { return "Info{" + "person=" + person.toString() + ", section=" + section.toString() + '}'; } }

###実行したソースコード

以下の様に単純な形のリストだとStreamでcomparingを使用して並び替えができます

java

package sorttest; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; public class SortTest { public static void main(String[] args) { List<Section> sectionList = new ArrayList<>(); sectionList.add(new Section("A", "あああ")); sectionList.add(new Section("C", "ううう")); sectionList.add(new Section("D", "えええ")); sectionList.add(new Section("B", "ううう")); System.out.println("sectionListをループ"); for (Section section : sectionList) { System.out.println(section.toString()); } System.out.println("-------------------------------------------------------"); System.out.println("-------------------------------------------------------"); System.out.println("-------------------------------------------------------"); System.out.println("sectionListをsectionNameでソートしてからループ"); List<Section> sectionList2 = new ArrayList<>(); sectionList2.addAll(sectionList.stream().sorted( Comparator.comparing(Section::getSectionCode)) .collect(Collectors.toList())); for (Section section : sectionList2) { System.out.println(section.toString()); } }
  • 実行結果
sectionListをループ Section{sectionCode=A, sectionName=あああ} Section{sectionCode=C, sectionName=ううう} Section{sectionCode=D, sectionName=えええ} Section{sectionCode=B, sectionName=ううう} ------------------------------------------------------- ------------------------------------------------------- ------------------------------------------------------- sectionListをsectionNameでソートしてからループ Section{sectionCode=A, sectionName=あああ} Section{sectionCode=B, sectionName=ううう} Section{sectionCode=C, sectionName=ううう} Section{sectionCode=D, sectionName=えええ}

###はまっているところ

以下のようにInfoオブジェクトの中にあるSectionオブジェクトの複数フィールドでソートしたい場合はどうするのがいいのでしょうか?

java

package sorttest; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; public class SortTest { public static void main(String[] args) { System.out.println("infoListをループ"); List<Info> infoList = new ArrayList<>(); infoList.add(new Info(new Person("taro", "yamada", 30), new Section("A", "あああ"))); infoList.add(new Info(new Person("sachiko", "sato", 28), new Section("C", "ううう"))); infoList.add(new Info(new Person("ichiro", "suzuki", 40), new Section("D", "えええ"))); infoList.add(new Info(new Person("Eri", "ito", 20), new Section("B", "ううう"))); for (Info info : infoList) { System.out.println(info.getPerson().toString()); System.out.println(info.getSection().toString()); System.out.println("-------------------------------------------------------"); } } }
  • 実行結果
infoListをループ Person{firstName=taro, lastName=yamada, age=30} Section{sectionCode=A, sectionName=あああ} ------------------------------------------------------- Person{firstName=sachiko, lastName=sato, age=28} Section{sectionCode=C, sectionName=ううう} ------------------------------------------------------- Person{firstName=ichiro, lastName=suzuki, age=40} Section{sectionCode=D, sectionName=えええ} ------------------------------------------------------- Person{firstName=Eri, lastName=ito, age=20} Section{sectionCode=B, sectionName=ううう} -------------------------------------------------------
  • SectionのsectionNameでソートして以下のようにしたい
  • **追記・・・**sectionNameだけでなくsectionCodeと合わせてソートするにはどうすればいいでしょうか?
Person{firstName=taro, lastName=yamada, age=30} Section{sectionCode=A, sectionName=あああ} ------------------------------------------------------- Person{firstName=Eri, lastName=ito, age=20} Section{sectionCode=B, sectionName=ううう} ------------------------------------------------------- Person{firstName=sachiko, lastName=sato, age=28} Section{sectionCode=C, sectionName=ううう} ------------------------------------------------------- Person{firstName=ichiro, lastName=suzuki, age=40} Section{sectionCode=D, sectionName=えええ} -------------------------------------------------------
  • よろしくお願いします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

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