2013-05-03 10 views
6

Sto collegando un elenco per trovare una voce specifica, quindi assegnarla a una variabile e provare a rimuoverla in seguito. È più facile da dimostrare che da spiegare.Come estrarre gli elementi "più piccoli" di K da un elenco di oggetti?

ArrayList<Example> list1 = populate(); 

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

So che questo probabilmente ha qualcosa a che fare con l'incapacità di Java per gestire i puntatori, ma una soluzione praticabile sarebbe grande.

Modifica: per elaborare, questo è un breve esempio del mio codice piuttosto che offrirti la cosa completa. Quello che sto facendo è scorrere un elenco per trovare i 10 numeri più bassi. La mia tecnica è quella di scorrere l'elenco, trovare il più basso e aggiungerlo a un altro elenco, quindi rimuovere quel numero dall'elenco originale e ripetere. Ma la mia lista è fatta di oggetti che hanno un valore int al loro interno, piuttosto che una lista di interi.

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

Potete per favore elaborare, esattamente cosa vorreste ottenere? – sanbhat

+2

Non è chiaro cosa intendi qui. Rimuovere gli elementi da una lista va bene, assegnarli anche a variabili va bene, ma dato che ex2 ed ex1 sono gli stessi qui, rimuoverete ex1. E 'questo quello che vuoi? –

+0

Mi sembra a posto. Quale è la domanda? –

risposta

2

Vorrei ordinare la lista. Quindi, vorrei creare un elenco con quei 10 oggetti più piccoli e modificare l'elenco originale list1 per contenere gli oggetti rimanenti. Qualcosa di simile:

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

NOTA: ho clonato sottolista perché sublist() restituisce solo un vista della lista list1, e questo non è ciò che si vuole qui.

La classe Example può implementare "Comparabile" in modo da poter definire il modo in cui devono essere confrontati. Dovrai implementare il metodo compareTo(). Qualcosa di simile a questo:

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

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

Dai un'occhiata alla this link, più precisamente la classe che inizia come segue:

public class Fruit implements Comparable<Fruit>{ 
+0

Questa è un'ottima soluzione ... ma la domanda afferma - "quindi rimuovere quel numero dalla lista originale". Il tuo metodo modifica l'elenco originale e non rimuoverà gli elementi. – Bill

+0

Questo è un punto. Ma poi può tenere solo gli elementi più grandi della lista ordinata ... – JonesV

+1

@ Bill Ma la domanda è stata (è?) Ingiustificata. La vera domanda è: qual è il modo migliore per trovare i numeri K più piccoli in una lista?Quindi, +1 –

1

Se si desidera ordinare gli oggetti ...

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 

Questo è solo uno pseudoCode e non l'ho compilato.

0

Qui si dovrà sovrascrivere il metodo comparabile per l'esempio di classe. Devi far sapere al compilatore in che modo dovrebbe confrontare la tua variabile e con gli elementi della sua lista in modo da rimuoverla.

Problemi correlati