2013-05-03 13 views
6

Przeszukuję listę, aby znaleźć konkretny wpis, a następnie przypisać go do zmiennej i spróbować usunąć później. Łatwiej jest przeprowadzić demo niż wytłumaczyć.Jak wyodrębnić "najmniejsze" elementy K z listy obiektów?

ArrayList<Example> list1 = populate(); 

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

Wiem, że to prawdopodobnie ma coś wspólnego z niezdolnością Javy do radzenia sobie ze wskaźnikami, ale realne rozwiązanie byłoby świetne.

Edycja: Aby to rozwinąć, jest to krótki przykład mojego kodu, a nie pełne przedstawienie. To, co robię, polega na iteracji listy, aby znaleźć najniższe 10 liczb. Moja technika polega na przejściu przez listę, znalezieniu najniższego i dodaniu jej do innej listy, a następnie usunięciu tego numeru z pierwotnej listy i powtórzeniu. Ale moja lista składa się z obiektów, które mają wewnątrz nich wartość int, a nie listy liczb całkowitych.

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

Czy możesz dopracować, dokładnie to, co chciałbyś osiągnąć? – sanbhat

+2

To trochę niejasne, co masz na myśli. Usuwanie elementów z listy jest w porządku, przypisanie ich do zmiennych również jest w porządku, ale ponieważ ex2 i ex1 są tutaj takie same, usuniesz ex1. Czy tego chcesz? –

+0

Wygląda to dobrze dla mnie. Jakie jest pytanie? –

Odpowiedz

2

Posortowałem listę. Następnie utworzyłbym listę z tymi 10 najmniejszymi obiektami i zmieniłem oryginalną listę list1, aby zawierała pozostałe obiekty. Coś jak:

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

UWAGA: I sklonowany z podmenu ponieważ sublist() zwraca tylko widok listy list1, a nie to, co chcesz tutaj.

Twoja klasa Example może zaimplementować opcję "Porównywalne", dzięki czemu możesz zdefiniować sposób porównywania. Będziesz musiał wdrożyć metodę compareTo(). Coś takiego:

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

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

Wystarczy popatrzeć na this link dokładniej klasę, która rozpoczyna się w następujący sposób:

public class Fruit implements Comparable<Fruit>{ 
+0

To jest świetne rozwiązanie ... ale pytanie brzmi: "następnie usuń ten numer z oryginalnej listy". Twoja metoda modyfikuje oryginalną listę i nie usuwa elementów. – Bill

+0

To jest sedno. Ale i tak może zachować tylko największe elementy posortowanej listy ... – JonesV

+1

@Bill Ale pytanie było (jest?) Źle zapytane. Prawdziwe pytanie brzmi: jaki jest najlepszy sposób na znalezienie najmniejszych liczb K na liście?Następnie, +1 –

1

Jeśli chcesz uporządkować obiekty ...

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 

To tylko pseudoCode i nie skompilowałem go.

0

Tutaj trzeba zastąpić porównywalną metodę klasy Przykład. Musisz pozwolić kompilatorowi wiedzieć, w jaki sposób porównać twoją zmienną e z elementami listy, aby ją usunąć.