Java - Trier un tableau basé sur les valeurs d'un autre tableau?
J'ai un tableau de Chaînes de caractères qui sont des instances d'une classe à partir d'un code externe, que je préfère ne pas changer.
J'ai également un tableau d'entiers qui ont été générées par l'appel d'une fonction sur chaque objet. J'ai donc
Un: [string1, string2, string3]
Et
B: [40, 32, 34]
Comment puis-je trier facilement Une telle qu'elle est triée par les valeurs de B. j'ai boost disponible. Je veux Un tel qu'il est dans l'ordre:
[string2, string3, string1]
En javascript vous pouvez faire cela comme:
B.sort(function(a,b){return A[B.indexOf(a)] < A[B.indexOf(b)];});
- Créer un Comparateur de cette première associés entre la valeur en
A
de valeur dansB
(dans le constructeur) et de l'utiliser pour trier - Ne pouvez-vous pas simplement de mettre en œuvre la même chose que l'option JavaScript de votre exemple comme un
Comparator
? - Vous devez écrire votre propre Comparateur.
- Vous pouvez également utiliser TreeMap (Valeurs en B comme la clé et la valeur correspondante dans Une valeur), étant donné que les valeurs de B sont uniques.
Vous devez vous connecter pour publier un commentaire.
Dans java 8, vous pouvez le faire
avec un lambda:
Ou mieux, avec Comparateur de:
Réponse courte: je suggère qu'une catégorie distincte est créée qui contient les informations à propos de la
String
et le développement (leint
). Si vous assumez le suivant:Ensuite, vous pouvez trier votre tableau en utilisant une
Comparator
et il fonctionne particulièrement bien avec le Java 8 Streaming API.La
Comparator
dans l'exemple ci-dessus est créé à l'aide de laComparator.comparingInt
méthode qui est un moyen pratique de créer unComparator
pour ints à l'aide de Java 8.Explication: Généralement lorsque l'on compare les objets en Java que vous utilisez une des fonctions de tri comme
Collections.sort
où vous fournissez votre propreComparator
. LeComparator
interface est simple et ressemble à ceci:La valeur de retour est de type
int
et est décrit comme cela dans la JavaDoc:Cela fonctionne out-of-the-box quand vous le tri
String
s ouint
(ou en faitInteger
s) car ils sontComparable
– en quelque sorte ils ont un tri naturel et pourString
s c'est dans l'ordre alphabétique et pourIntegers
c'est triée dans l'ordre croissant de numéro de commande (voir la JavaDoc pourComparable
).Sur une note de côté, il y a d'autres "paire" ou "tuple" implémentations disponibles si vous utilisez 3ème partie les bibliothèques. Vous n'avez pas à créer votre propre "paire" d'un
String
etint
. Un exemple est la Paire classe de Apache Commons.Vous pouvez faire quelque chose de similaire à votre JS exemple dans le vieux style Java (mais je vous recommande de rejoindre vos données dans un objet comme @wassgren l'indique):
J'ai résolu ce problème en utilisant le Comparateur interface.
Si vous êtes à la construction de la matrice B doit être utilisé uniquement pour ce tri, vous pouvez différer le calcul de ses valeurs au sein d'Un de compareTo(). En d'autres termes, calculer le poids des chaînes uniquement dans les comparaisons au cours de tri.
Utilisez le Comparateur pour le tri en fonction de leur valeur.
J'ai eu un problème similaire, et résolu par le codage d'un algorithme de tri qui triées un tableau de mesures, et de fait identiques swaps dans le tableau d'objets. Voici le code, avec des tests, meilleurs voeux et pas de promesses:
Peut-être pas exactement pour ce cas, mais pour ceux qui la recherche pour répondre à comment trier un tableau de Chaîne de caractères en fonction d'une autre:
En java, vous devez avoir deux tableaux, l'un copier de les trier off et le tableau que vous souhaitez trier.
avec un lambda:
Ou avec Comparateur:
Faire un
TreeMap<Integer, List<ObjectTypeFromA>>
où la carte est la clé de valeurs dans B, et la carte des valeurs sont les valeurs de A (à l'aide d'une liste pour permettre de dupliquer des clés). Il sera classé dans l'ordre de B par définition.int[] ints = { 40, 32, 32, 34 };