import java.util.List;
import java.util.Objects;
import java.util.TreeSet;
class Scratch {
public static void main
(String[] args
) { Foo fooOne = Foo.of(1);
Foo fooTwo = Foo.of(2);
Foo fooThree = Foo.of(3);
TreeSet<Foo> set = new TreeSet<>();
set.
addAll(List.
of(fooOne, fooTwo, fooThree
)); System.
out.
println(set.
size()); fooOne.setValue(4);
set.add(fooOne);
System.
out.
println(set.
size()); }
}
class Foo implements Comparable<Foo> {
private int value;
private Foo(int value) {
this.setValue(value);
}
public static Foo of(int value) {
return new Foo(value);
}
public int getValue() {
return value;
}
public Foo setValue(int value) {
this.value = value;
return this;
}
@Override
public boolean equals
(Object o
) { if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Foo foo = (Foo) o;
return getValue() == foo.getValue();
}
@Override
public int hashCode() {
return Objects.hash(value);
}
@Override
public int compareTo(Foo that) {
return getValue() - that.getValue();
}
}
aW1wb3J0IGphdmEudXRpbC5MaXN0OwppbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CmltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKCmNsYXNzIFNjcmF0Y2ggewogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIEZvbyBmb29PbmUgPSBGb28ub2YoMSk7CiAgICAgICAgRm9vIGZvb1R3byA9IEZvby5vZigyKTsKICAgICAgICBGb28gZm9vVGhyZWUgPSBGb28ub2YoMyk7CiAgICAgICAgVHJlZVNldDxGb28+IHNldCA9IG5ldyBUcmVlU2V0PD4oKTsKICAgICAgICBzZXQuYWRkQWxsKExpc3Qub2YoZm9vT25lLCBmb29Ud28sIGZvb1RocmVlKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNldC5zaXplKCkpOwogICAgICAgIGZvb09uZS5zZXRWYWx1ZSg0KTsKICAgICAgICBzZXQuYWRkKGZvb09uZSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNldC5zaXplKCkpOwogICAgfQp9CgpjbGFzcyBGb28gaW1wbGVtZW50cyBDb21wYXJhYmxlPEZvbz4gewogICAgcHJpdmF0ZSBpbnQgdmFsdWU7CgogICAgcHJpdmF0ZSBGb28oaW50IHZhbHVlKSB7CiAgICAgICAgdGhpcy5zZXRWYWx1ZSh2YWx1ZSk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBGb28gb2YoaW50IHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIG5ldyBGb28odmFsdWUpOwogICAgfQoKICAgIHB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQoKICAgIHB1YmxpYyBGb28gc2V0VmFsdWUoaW50IHZhbHVlKSB7CiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAgICAgICAgaWYgKHRoaXMgPT0gbykgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIEZvbyBmb28gPSAoRm9vKSBvOwogICAgICAgIHJldHVybiBnZXRWYWx1ZSgpID09IGZvby5nZXRWYWx1ZSgpOwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKHZhbHVlKTsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEZvbyB0aGF0KSB7CiAgICAgICAgcmV0dXJuIGdldFZhbHVlKCkgLSB0aGF0LmdldFZhbHVlKCk7CiAgICB9Cn0=