Java向け競プロライブラリ(ペア)

ソート可能なペアとして入力値を取り扱うと解きやすい問題向けのライブラリです。必要ならば、問題の条件に適合するようにソート条件を変更して使います。

例えば以下の問題で役に立ちます。

AtCoder Beginner Contest 256 D - Union of Interval

2023/09/18追記:HashSetなどで取り扱う際に所望通りの挙動をしなかったためhashCodeメソッドを追加、およびequalsメソッドのキャスト例外握り潰しを廃止

import java.util.Objects;

public final class Pair<F extends Comparable<F>, S extends Comparable<S>>
		implements Comparable<Pair<F, S>> {

	private F first;
	private S second;

	public Pair(F first, S second) {
		this.first = first;
		this.second = second;
	}

	public F getFirst() {
		return first;
	}

	public S getSecond() {
		return second;
	}

	public void setFirst(F first) {
		this.first = first;
	}

	public void setSecond(S second) {
		this.second = second;
	}

	@Override
	public int compareTo(Pair<F, S> o) {
		int t = this.first.compareTo(o.getFirst());

		if (t != 0) {
			return t;
		}

		return this.second.compareTo(o.getSecond());
	}

	@Override
	public boolean equals(Object obj) {
		if (obj == null) {
			return false;
		}

		Pair<F, S> another = (Pair<F, S>) obj;
		return Objects.equals(this.getFirst(), another.getFirst())
				&& Objects.equals(this.getSecond(), another.getSecond());

	}

	@Override
	public int hashCode() {
		int h1 = first.hashCode();
		int h2 = second.hashCode();
		String connected = String.valueOf(h1) + ' ' + String.valueOf(h2);
		return connected.hashCode();
	}

	@Override
	public String toString() {
		return Objects.toString(first) + ' ' + Objects.toString(second);
	}

}