2013-05-03 5 views
6

Я просматриваю список, чтобы найти конкретную запись, а затем присваиваю ее переменной и пытаюсь ее удалить позже. Демо легче, чем объяснять.Как извлечь K "самых маленьких" элементов из списка объектов?

ArrayList<Example> list1 = populate(); 

Example ex1 = list1.get(0); 
Example ex2 = ex1; 
list1.remove(ex2); 

Я знаю, что это, вероятно, имеет отношение к неспособности Java обрабатывать указатели, но жизнеспособное решение было бы замечательным.

Редактировать: Чтобы разработать, это краткий пример моего кода, а не предоставление вам полной информации. То, что я делаю, это перебирать список, чтобы найти самые низкие 10 чисел. Моя техника заключается в том, чтобы пройти список, найти самый низкий и добавить его в другой список, а затем удалить это число из исходного списка и повторить. Но мой список составлен из объектов, которые внутри имеют значение int, а не список целых чисел.

for(0 to 9){ 
    for(0 to list.size){ 
     if(list.get(x) < smallest) 
      smallest = list.get(x) 
    } 
    smallestList.add(smallest); 
    list.remove(smallest) 
} 
+0

Не могли бы вы уточнить, что именно вы хотели бы достичь? – sanbhat

+2

Немного непонятно, что вы имеете в виду здесь. Удаление элементов из списка в порядке, назначение их для переменных также прекрасное, но поскольку ex2 и ex1 здесь одинаковы, вы удалите ex1. Это то, что вы хотите? –

+0

Это выглядит хорошо для меня. Что за вопрос? –

ответ

2

Я бы выбрал этот список. Затем я создам список с этими 10 наименьшими объектами и изменим исходный список list1, чтобы содержать остальные объекты. Что-то вроде:

Collection.sort(list1); 
ArrayList<Example> yourSmallestElements = (ArrayList<Example>)(list1.sublist(0, 9).clone()); 
list1.removeAll(yourSmallestElements); 

ПРИМЕЧАНИЯ: Я клонировал подсписок, потому что sublist() возвращает только вида списка list1, и это не то, что вы хотите здесь.

Ваш класс Example может реализовать «Comparable», чтобы вы могли определить, как их нужно сравнивать. Вам необходимо будет реализовать метод compareTo(). Что-то вроде этого:

public class Example implements Comparable<Example> { 
    private int integerVal = <a value>; 

    public int compareTo(Example exampleObject) { 
     return exampleObject.integerVal - this.integerVal; 
    } 
} 

Посмотрите на this link, точнее класс, который начинается следующим образом:

public class Fruit implements Comparable<Fruit>{ 
+0

Это отличное решение ... но вопрос гласит - «затем удалите это число из исходного списка». Ваш метод изменяет исходный список и не удаляет элементы. – Bill

+0

Это точка. Но в любом случае он может хранить только самые большие элементы отсортированного списка ... – JonesV

+1

@Bill Но вопрос был (есть?) Неверно задан. Реальный вопрос: какой лучший способ найти наименьшие числа K в списке?Тогда +1 –

1

Если вы хотите, чтобы отсортировать объекты ...

Example e; 
int min=-1; // assuming the list has +ve numbers only 
for (Example elem : yourList) 
{ 
if (elem.gtVaribale() <= min) //assuming you have variable field in your object 
{ 
    e = elem; 
    min = elem.getVariable(); 
} 
} 
yourList.remove(e); 

//repeat this for remaining elements of the list 

//you can create another sorted list, and do sortedList.add(e), so that sortedList 
//have objects in ascending order (of the variable you want to sort) of objects you had in yourList 

Это всего лишь псевдокод, и я его не скомпилировал.

0

Здесь вам нужно будет переопределить сопоставимый метод для класса Example. Вы должны сообщить компилятору, каким образом он должен сравнить вашу переменную e с ее элементами списка, чтобы удалить ее.

Смежные вопросы