2013-11-25 10 views
35

Per esempio: un elencoCome muoversi elemento specifico in lista di array sul primo elemento

ABCDE

Dato C, passare a

CABDE

Si noti che la dimensione della matrice cambierà , alcuni articoli possono essere rimossi nei tempi di esecuzione

Collections.swap(url, url.indexOf(itemToMove), 0); 

Questo statemen t non funziona perché emette C B A D E non C A B D E, come risolverlo?

Grazie.

+0

Che cos'è l'url qui? –

risposta

58

Quello che vuoi è un'operazione molto costosa in un ArrayList. Richiede lo spostamento di ogni elemento tra l'inizio dell'elenco e la posizione di C in basso di uno.

Tuttavia, se si vuole veramente farlo:

int index = url.indexOf(itemToMove); 
url.remove(index); 
url.add(0, itemToMove); 

Se questa è un'operazione frequente per voi, e l'accesso casuale è invece meno frequente, si potrebbe prendere in considerazione il passaggio a un altro List implementazione come LinkedList. Dovresti anche considerare se una lista è la giusta struttura dati se sei così preoccupato per l'ordine degli elementi.

+3

se la velocità è un criterio, allora forse dovresti anche dare un'occhiata a http://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/list/TreeList. html –

9

Utilizzare questa: Rimuovere: ArraylistObj.remove(object); aggiungendo alla posizione specifica: ArrayListObj.add(position, Object);

Come per l'utilizzo di codice in questo modo:

url.remove("C"); 
url.add(0,"C"); 
+1

non aumenterà la dimensione della lista? –

+0

Quindi rimuovere l'elemento dall'elenco utilizzando url.remove ("C"); e aggiungi l'elemento alla posizione zero usando url.add (0, "C"); –

3

Il problema è, si scambia C con A, in modo da ABCDE diventa CBAD E.

Si potrebbe provare qualcosa di simile:

url.remove(itemToMove); 
url.add(0, itemToMove); 

O se url è un LinkedList:

url.remove(itemToMove); 
url.addFirst(itemToMove); 
0

Questo codice consentirà di aumentare la dimensione della lista e inserire elementi senza disturbare altrimenti l'ordine della lista

private void insert(double price){ 
    for(int i = 0; i < keys.size(); i++){ 
     if(price > keys.get(i)){ 
      keys.add(null); 
      for(int j = keys.size()-1; j > i; j--){ 
       Collections.swap(keys, j, j-1); 
      } 
      keys.add(price); 
      Collections.swap(keys, keys.size()-1, i); 
      keys.remove(keys.size()-1); 
      return; 
     } 
    } 
    keys.add(price); 
} 
0

Diciamo che avete un array:

String[] arrayOne = new String[]{"A","B","C","D","E"}; 

ora si vuole posizionare il C all'indice 0 ottenere il C in un'altra variabile

String characterC = arrayOne[2]; 

Ora eseguire il ciclo come segue:

for (int i = (2 - 1); i >= 0; i--) { 

      arrayOne[i+1] = arrayOne[i]; 
     } 

Sopra 2 è l'indice di C.Ora inserire C di indice ad esempio su 0

arrayOne[0] = characterC; 

Risultato di ciclo sopra sarà così:

arrayOne: {"C","A","B","D","E"} 

Alla fine, abbiamo raggiungere il nostro obiettivo.

1

Un'altra soluzione, è sufficiente continuare a passare da 0 a indexOf(itemToMove).

Questa è la mia versione Kotlin:

val list = mutableListOf('A', 'B', 'C', 'D', 'E') 
(0..list.indexOf('C')).forEach { 
    Collections.swap(list, 0, it) 
} 

mi dispiace familiarità con Java, ma imparato un po 'Kotlin. Ma l'algoritmo è lo stesso.

Problemi correlati