2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Java8】TreeSet<クラス>での並び替え順&中からもっとも近いものを取得

Last updated at Posted at 2021-03-03

###課題:一列のクラスリストをある順番で並び替え、そして中から目標クラスと等しい、なければそれよりもっとも近い(以下でも以上でも)のを取得

色々調べて、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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?