compareTo

0

Witam, Jak użyć metody compareTo aby posortować TreeSeta składającego się z obiektów po określonym polu ale aby nie kasowała obiektów które mają tą samą wartość w tym polu ??

0

Set zawsze będzie przechowywał unikalne obiekty. Zatem jeżeli dwa z nich mają taką samą wartość pola to jeden poleci. Jedyne rozwiązanie to rozszerzenie warunku sortowania o kolejne pole. Jeżeli nie masz takiego pola to masz problem.

0

tzn mam takie pole :) ale nie wiem jak to zaaplikować do compareTo :(

0

Przykład. Foo posortowane po "id" i w drugiej kolejności po "id2". Należy uważać na przepełnienie.

public class SetTest {
	
	public static int compareInts(int i1, int i2){
		if (i1 > i2) return 1;
		return i1 < i2 ? -1 : 0;
	}
	
	
	static class Foo implements Comparable<Foo> {
		final int id;
		final int id2;

		public Foo(int id, int id2) {
			super();
			this.id = id;
			this.id2 = id2;
		}
		
		@Override
		public int compareTo(Foo o) {
			int diff =  compareInts(id, o.id);

			return (diff != 0 ? diff : compareInts(id2, o.id2));
		}

		@Override
		public String toString() {
			return new StringBuilder().append("Foo[").append(id).append(",").append(id2)
					.append("]").toString();
		}
	}

	public static void main(String[] args) {
		TreeSet<Foo> set = new TreeSet<Foo>();
		set.add(new Foo(Integer.MAX_VALUE, 1));
		set.add(new Foo(Integer.MIN_VALUE, 2));
		set.add(new Foo(1, 1));
		set.add(new Foo(2, -1));
		set.add(new Foo(1, 0));
		set.add(new Foo(1, 2));
		System.out.println(set);
	}
}

Metodę compareTo można też napisać tak:

	@Override
	public int compareTo(Foo o) {
		long diff = ((long) id) - o.id;
		if (diff == 0){
			diff = ((long) id2) - o.id2;
		}
		if (diff > 0) return 1;
		return diff < 0 ? -1 : 0; 
	}

Natomiast compareInts tak (ale jest mniej efektywne):

	private static int compareInts(int i1, int i2){
		return Integer.valueOf(i1).compareTo(i2);
	}
0

dzięki :)
Bardzo mi pomogłeś :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1