Мне нужно отсортировать списки объектов с нестатическим компаратором, который использует значение из его внешнего поля объекта.Java: ссылка от нестатического компаратора на его внешнее поле класса
class A {
public int x;
public int y;
public int z;
public Comparator<A> scoreComparator = new Comparator<A>() {
public compare(A o1, A o2) {
// System.out.println("this: " + this);
return (int) (x * o1.x - x * o2.x);
}
}
public A(int _x, int _y, int _z) {
x = _x;
y = _y;
z = _z;
}
}
A var_1 = new A(1, 2, 3);
A var_2 = new A(5, 6, 7);
List<A> list = getMyListFromSomewhere();
// the following will produce different ordering
Collections.sort(list, var_1.scoreComparator);
Collections.sort(list, var_2.scoreComparator);
Но по какой-то причине это не работает должным образом. Когда я раскомментирую строку println в компараторе, это показывает, что ссылки относятся к объектам A, но они различаются внутри одного вызова sort(), поэтому значение «x» отличается. Что я здесь делаю неправильно?
В вашем примере не учитывается внутреннее состояние другого объекта. То, что я хочу достичь, - это различный порядок в зависимости от того, какой экземпляр A я беру как «базу». Например: у меня есть объекты v1 и v2 - оба экземпляра A. У меня есть список [v3, v4, v5]. Когда я сортирую с «базовым» v1, я получаю [v4, v5, v1], когда сортирую «основанный» на v2, я получаю [v5, v1, v4]. Порядок отсортированного списка зависит от внутренних значений полей v1 и v2 соответственно. – osjak
Хорошо, ваш код выглядит хорошо. Можете привести несколько примеров? – gpeche
И вообще, я бы сделал компаратор статическим классом и передал бы «x» в качестве пареметра к его конструктору. – gpeche