0
0

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.

SelectItemのListをソートする方法

Last updated at Posted at 2020-09-10

選択肢を設定するのによく使うSelectItemのList。データベースから取得した値を使ったりすると並べ替えをしたいことがある。そんな時用。

  • 環境
    • CentOS Linux release 7.8.2003 (Core)
    • openjdk version "11.0.7" 2020-04-14 LTS
    • JSF 2.3.9

例えばこんなSelectItemのListがある場合のこと

value label
1 いぬ
3 さる
0 くま
2 ねこ
/** SelectItemのリスト. */
@Getter
private List<SelectItem> items;

/** SelectItemのリストを設定する. */
private void setItems() {
    this.items = new ArrayList<SelectItem>();
    this.items.add(new SelectItem(1, "いぬ"));
    this.items.add(new SelectItem(0, "くま"));
    this.items.add(new SelectItem(3, "さる"));
    this.items.add(new SelectItem(2, "ねこ"));
}

valueの昇順でソートする

参考 : Collections (Java Platform SE 8)

value label
0 くま
1 いぬ
2 ねこ
3 さる
Collections.sort(this.items, new Comparator<SelectItem>() {
    @Override
    public int compare(SelectItem item1, SelectItem item2) {
        if (item1 != null && item2 != null) {
            if (item1.getValue() != null && item2.getValue() != null) {
                return item1.getValue().toString().compareTo(item2.getValue().toString());
            }
        }
        return 0;
    }
});

(おまけ)valueの最小値を取得する

SelectItem minItem = Collections.min(this.items, new Comparator<SelectItem>() {
    // 内容はソートと同じ
});
var min = Integer.valueOf(minItem.getValue().toString());

valueの降順でソートする

参考 : Comparator (Java Platform SE 8)

value label
3 さる
2 ねこ
1 いぬ
0 くま
// 昇順のreturnにあるitem1とitem2を逆にしただけ
Collections.sort(this.items, new Comparator<SelectItem>() {
    @Override
    public int compare(SelectItem item1, SelectItem item2) {
        if (item1 != null && item2 != null) {
            if (item1.getValue() != null && item2.getValue() != null) {
                return item2.getValue().toString().compareTo(item1.getValue().toString());
            }
        }
        return 0;
    }
});

labelの昇順でソートする

参考 : ひらがなとアルファベットがまざったリストのソートをする - Qiita

value label
1 いぬ
0 くま
3 さる
2 ねこ
Comparator.comparingを使う方法
this.items = this.items.stream().sorted(Comparator.comparing(SelectItem::getLabel)).collect(Collectors.toList());
Collator.getInstanceを使う方法
Collections.sort(this.items, new Comparator<SelectItem>() {
    @Override
    public int compare(SelectItem item1, SelectItem item2) {
        if (item1 != null && item2 != null) {
            if (item1.getLabel() != null && item2.getLabel() != null) {
                return Collator.getInstance(Locale.JAPANESE).compare(item1.getLabel(), item2.getLabel());
            }
        }
        return 0;
    }
});

labelの降順でソートする

value label
2 ねこ
3 さる
0 くま
1 いぬ
Comparator.comparingを使う方法
// reversed()をくっつけて降順にする
this.items = this.items.stream().sorted(Comparator.comparing(SelectItem::getLabel).reversed()).collect(Collectors.toList());
Collator.getInstanceを使う方法
// 昇順のreturnにあるitem1とitem2を逆にしただけ
Collections.sort(this.items, new Comparator<SelectItem>() {
    @Override
    public int compare(SelectItem item1, SelectItem item2) {
        if (item1 != null && item2 != null) {
            if (item1.getLabel() != null && item2.getLabel() != null) {
                return Collator.getInstance(Locale.JAPANESE).compare(item2.getLabel(), item1.getLabel());
            }
        }
        return 0;
    }
});

ソートしようとして失敗したこと

Comparatorという便利なものを知ったので早速使おうとして失敗した。
Comparator.comparing(SelectItem::getValue)あたりでコンパイルエラーになる。
SelectItemのvalueはObjectなのでソートのキーにできないのか・・・な?

this.items = this.items.stream().sorted(Comparator.comparing(SelectItem::getValue)).collect(Collectors.toList());
0
0
1

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?