Вы должны заказать свою коллекцию как на x
и y
с x
первым (думаю о нем, как х и у формирования гипотетического числа с х в левой части десятичной точки и y с правой стороны: при сортировке числа в порядке возрастания, если составные части равны, вы сортируете десятичную часть). Теперь, с предикатом equal
, будет сложно сортировать значения (вы можете только сказать, равны ли они, а не если они находятся перед другим). Вместо этого, вы должны реализовать интерфейс comparable
со следующим методом:
public int compare(Object obj) {
if (obj == null || !(obj instanceof MyObject)) {
// raise an Exception
}
MyObject other = (MyObject)obj;
if (x < other.x) return -1;
if (this.x > other.x) return 1;
if (this.y < other.y) return -1;
if (this.y > other.y) return 1;
return 0;
}
Если массив отсортирован в соответствии с этим сравнением, нужно просто сохранить последнюю запись с таким же x
в массиве, чтобы получить то, что вы хотите. Это означает, что вы удаляете записи , если только у его преемника нет x
.
Этот метод интересен тем, что вы не хотите хранить исходные данные, но сохраняете результат: он обновит существующий массив на месте, для сложности O (n) во времени (не считая сортировка, которая должна произойти в любом случае, если я правильно понимаю ваш вопрос).
В качестве альтернативы, вся фильтрация может быть достигнуто путем применения раз на вашей коллекции, где складной здесь просто сохраняя высокий y
для одного и того же x
(как вы заявили, это именно в вашем вопросе). Поскольку ваша коллекция уже отсортирована по адресу x
, это означает, что она естественно разделена на значения x
, поэтому вы можете построить новую коллекцию с помощью , аккумулируя для правильного x
для каждого раздела в другом массиве. Для каждого элемента массива вы сравниваете его с последней вставленной записью в новом массиве, если x
одинаковы, вы заменяете его на объект с самым высоким y
. Если значения x
отличаются друг от друга, вы добавляете их в новый массив.
Преимущество этого подхода в том, что вам не нужно менять алгоритм сортировки, но с другой стороны вам нужен новый массив. Поэтому этот алгоритм должен работать в пространстве O (n).
Наконец, этот алгоритм может быть адаптирован к обновлению исходного массива на месте. Это немного сложнее, но позволит вам избежать дополнительного распределения (что важно для встроенных систем).
Псевдо код:
int idx = 0;
while (idx + 1 < Objarray.size()){
MyObj oi = Objarray.get(idx), on = Objarray.get(idx+1);
if (oi.x == on.x) {
if (on.y < oi.y)
Objarray.remove(idx++);
else
Objarray.remove(idx+1);
} else
idx++;
}
Обратите внимание, что при работе в постоянном пространстве, может быть немного менее эффективным, чем алгоритм расПредеЛение, из-за способа ArrayList
работает внутри (хотя это должно быть лучше, чем использовать другие обычные типы контейнеров).
Обычно, 'х == х + 1 'никогда не верно. Вероятно, вы имели в виду 'x == x1' и смешивали его с тем фактом, что в вашем списке записи с одинаковым значением' x' сохраняются последовательно. – didierc
да, извините, спасибо – user2335528
Теперь, если вы правильно сортируете предметы как на x, так и на y, проблема становится тривиальной. – didierc