###課題:一列のクラスリストをある順番で並び替え、そして中から目標クラスと等しい、なければそれよりもっとも近い(以下でも以上でも)のを取得
色々調べて、TreeSetというものにたどり着いたんです。今まではSet,ArrayListのようなを使ってきたが、これを使うの初めてです。
クラスのTreeSetを作るには並び順番を決める必要があるそうです。
例のクラス:
public class Person {
private int id;
private int age;
private String name;
}
このクラスで並びの優先度は
###ID > AGE > NAME
とします。
##並び替え
Java8でTreeSetを作る同時に上記の並び順のComparatorを一緒に入れます。
TreeSet<Person> set = new TreeSet<>(Comparator.comparing(Person::getId)
.thenComparing(Person::getAge)
.thenComparing(Person::getName)
);
そしていくつかのPersonを入れます
入れるもの
personA.setId(3);
personA.setAge(10);
personA.setName("A");
personA2.setId(3);
personA2.setAge(5);
personA2.setName("A2");
personB.setId(2);
personB.setAge(5);
personB.setName("B");
personB2.setId(2);
personB2.setAge(10);
personB2.setName("B2");
personC.setId(1);
personC.setAge(3);
personC.setName("C");
personC2.setId(1);
personC2.setAge(3);
personC2.setName("C2");
set.add(personA);
...
...
入れた後の結果はこんな感じです
set.forEach(item -> {
System.out.print("Id : " + item.getId() + " , ");
System.out.print("Age : " + item.getAge() + " , ");
System.out.println("Name : " + item.getName());
});
Id : 1 , Age : 3 , Name : C
Id : 1 , Age : 3 , Name : C2
Id : 2 , Age : 5 , Name : B
Id : 2 , Age : 10 , Name : B2
Id : 3 , Age : 5 , Name : A2
Id : 3 , Age : 10 , Name : A
ちゃんと ID > Age > Nameの順番で並んでいます!
##取得
次は等しい、なければもっとも近いものを取得です!
使うのmethodは下記です
Person targetPerson = new Person();
targetPerson.setId(1);
targerPerson.setAge(5);
targetPerson.setName("B");
//等しくものがなければ目標より以上もっとも近いもの
Person ceiling = set.ceiling(targetPerson);
//等しくものがなければ目標より以下もっとも近いもの
Person floor = set.floor(targerPerson);
//目標より以上もっとも近いもの
Person higher = set.higher(targerPerson);
//目標より以下もっとも近いもの
Person lower = set.lower(targerPerson);
さっきの結果から
Id : 1 , Age : 3 , Name : C
Id : 1 , Age : 3 , Name : C2
Id : 2 , Age : 5 , Name : B
Id : 2 , Age : 10 , Name : B2
Id : 3 , Age : 5 , Name : A2
Id : 3 , Age : 10 , Name : A
Target:
Id : 1 , Age : 5 , Name : B
Ceiling Result :
Id : 2 , Age : 5 , Name : B
Floor Result :
Id : 1 , Age : 3 , Name : C2
Higher Result :
Id : 2 , Age : 5 , Name : B
Lower Result :
Id : 1 , Age : 3 , Name : C2
Ceiling、FloorとHigher、Lower両方とも同じ結果を取得できるが、違いは同じものを取るかどうかだけです
Id : 1 , Age : 3 , Name : C
Id : 1 , Age : 3 , Name : C2
Id : 2 , Age : 5 , Name : B //Targetと全く同じ
Id : 2 , Age : 10 , Name : B2
Id : 3 , Age : 5 , Name : A2
Id : 3 , Age : 10 , Name : A
Target:
Id : 2 , Age : 5 , Name : B
Ceiling Result :
Id : 2 , Age : 5 , Name : B
Floor Result :
Id : 2 , Age : 5 , Name : B
Higher Result :
Id : 2 , Age : 10 , Name : B2
Lower Result :
Id : 1 , Age : 3 , Name : C2
以上です!自由にお試してください!
TreeSetの他の取得は公式Docで
https://docs.oracle.com/javase/jp/8/docs/api/java/util/TreeSet.html