import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Element implements Comparable<Element> { 

		private final int x; 
		private final int y; 

		Element(int x, int y) { 
			this.x = x; 
			this.y = y; 
		} 

		@Override 
		public boolean equals(Object o) { 
			if (this == o) { 
				return true; 
			} 
			if (o == null || getClass() != o.getClass()) { 
				return false; 
			} 
			Element element = (Element) o; 
			return x == element.x && y == element.y; 
		} 

		@Override 
		public int hashCode() { 
			return Objects.hash(x, y); 
		} 

		@Override 
		public int compareTo(Element o) { 
			return Integer.compare(x, o.x); // equals == false and compareTo == 0 is possible 
		} 

		@Override 
		public String toString() { 
			return "Element{" + "x=" + x + ", y=" + y + '}'; 
		} 

		public static void main(String[] args) { 
			Element element1 = new Element(1, 1); 
			Element element2 = new Element(1, 2); 
			Element element3 = new Element(2, 1); // same as element5 
			Element element4 = new Element(2, 2); 
			Element element5 = new Element(2, 1); // same as element3 

			List<Element> sortedDistinctElementList = Stream.of(element1, element2, element3, element4, element5)
					.sorted().distinct().collect(Collectors.toList()); 


			System.out.println("sortedDistinctElementList"); 
			System.out.println(sortedDistinctElementList.size()); 
			System.out.println(sortedDistinctElementList); 

			Set<Element> distinctElementSet = new HashSet<>(sortedDistinctElementList); 

			System.out.println("distinctElementSet"); 
			System.out.println(distinctElementSet.size()); 
			System.out.println(distinctElementSet); 
		} 
	}
