2012-10-10 11 views
6

Ho una matrice di doppi, in Java: arr1 che voglio ordinare. Molto probabilmente la prima opzione sarebbe il metodo di utilità Arrays.sort(double[]).Ordina array e riflette le modifiche in un altro array

L'idea è che voglio le stesse modifiche (per esempio valore index i viene scambiato con valore a index j in arr1) a riflettersi in un altro array di interi: arr2 (nel senso che i valori agli stessi indici vengono cambiati anche in arr2).

C'è un modo semplice (un trucco) per realizzare questo in Java? O l'unico modo è di implementare l'algoritmo di ordinamento da solo?

UPDATE: vedo che gente suggerisce sostituendo i due array con un array di oggetti contenenti i 2 valori (uno arr1 e uno dal arr2). Non porterebbe alcune sanzioni di efficienza. In altre parole, non è meno efficiente ordinare una matrice di oggetti rispetto a una matrice di tipi primitivi (raddoppia in questo caso)?

I dati sono completamente statici. È grande (si adatta alla memoria) ma statico.

+2

Avere una matrice di indici Non ordinare l'array di valori, ordinare l'array di indici. Quindi utilizzare l'array di indici per puntare a entrambi gli array di valori. Vedere la soluzione in: http: //stackoverflow.com/questions/4859261/get-the-indices-of-an-array-after-sorting – Raihan

+0

http://stackoverflow.com/questions/112234/sorting-matched-arrays -in-java – talnicolas

+0

Questo è ciò che verrebbe definito un "ordinamento esterno". –

risposta

7

Piuttosto che cercare di mantenere ordinati array paralleli, una soluzione più pulita sarebbe quella di creare una classe che incapsula entrambi i valori dei dati e avere solo una matrice di oggetti.

(Ma per rispondere alla domanda, non esiste un modo integrato per farlo in Java. L'implementazione della propria routine di ordinamento che mantiene ordinati due array in base ai valori in uno di essi funzionerebbe per una piccola quantità di dati che non è probabile che cambi, ma sarebbe difficile da mantenere.)

+0

L'ordinamento di una matrice di oggetti è efficiente come ordinare una matrice di doppi? – Razvan

+0

@Razvan L'ordinamento di una matrice di oggetti sarà estremamente efficiente. Dubito che saresti in grado di misurare la differenza. –

+1

ho appena pensato di menzionare l'interfaccia 'Comparable' per il tuo nuovo oggetto. http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html –

1

Una soluzione che non ha alcun impatto sulle prestazioni di ordinamento, vale a dire ancora complessità di tempo O (nlog (n)).

  • Usare una mappa per memorizzare array[i] -> i
  • ordinare l'array
  • iterare l'array ordinato, e per ogni valore, utilizzarlo come chiave per la mappa per recuperare l'indice originale.

Edit: Raihan commento mi fanno guardare miserabile :(

1

Prova in questo modo ....

- convertire questo array in ArrayList utilizzando il Arrays.asList()

- Creare un'altra variabile di riferimento per l'oggetto List e assegnarvi lo stesso oggetto ArrayList, ora qualsiasi modifica al primo ArrayList verrà riflessa nel Se cond ArrayList.

Esempio:

double[] array = new double[10]; 

ArrayList<Double> arList_1 = new ArrayList<Double>(Arrays.asList(array)); 

ArrayList<Double> arList_2 = arList2; 

Ora per l'ordinamento, ci sono 2 opzioni:

- Usa java.lang.Comparable interfaccia, se si vuole risolvere la in solo 1 modo.

- Utilizzare l'interfaccia java.util.Comparator, se si desidera ordinarlo in più di 1 modo.

0

Nota che cosa stai cercando, ma un'altra soluzione potrebbe essere così.

Creare una mappa per mantenere il rapporto tra arr1 e arr2 elments

 Map<Double, Double> myLocalMap<Double, Double>(); 
     for(int ind=0; indx < arr1.length; indx++){ 
      myLocalMap.put(Double.valueOf(arr1[indx]), Double.valueOf(arr2[indx])); 
     } 

Ora sorta arr1 come hai detto:

 Arrays.sort(arr1); 

volta arr1 è ordinato, aggiornare arr2 come di seguito:

 for(int ind=0; indx < arr1.length; indx++){ 
      arr2[indx] = myLocalMap.get(arr1[indx]).doubleValue(); 
     } 
Problemi correlati