J'ai deux tableaux qui ne sont pas triés: un tableau float ( float []
) et un tableau String ( String []
) pour les descriptions.
J'ai besoin de trier le tableau flottant de la valeur la plus élevée à la plus basse , mais les descriptions sont dans le tableau String et si je les trie , le tableau String ne sera pas trié en conséquence.
Dans Processing , il y a un sort (Array)
, mais il ne trie qu'un seul tableau.
Comment puis-je trier le float array et les descriptions correspondent-elles?
float totalCount = 0; float maxValue = 0; String[] statusDescriptions = new String[finishStatusesJSON.size()]; float[] countData = new float[finishStatusesJSON.size()]; for (int i = 0; i < finishStatusesJSON.size(); i++) { JSONObject finishStatusJSON = (JSONObject) finishStatusesJSON.get(i); float count = finishStatusJSON.getFloat("count"); String status = finishStatusJSON.getString("status"); totalCount += count; statusDescriptions[i] = status; countData[i] = count; // Max value of the table if(maxValue < count) maxValue = count; }
3 Réponses :
Une solution serait de créer une classe qui contient vos entrées, c'est-à-dire qui combine un flottant avec sa description. Par exemple, si vous stockez des films sous forme de chaînes et leurs partitions sous forme de flottants, vous pouvez créer une classe MovieScore
contenant la description du film (la chaîne) et son score (le flottant). Vous pouvez rendre cette classe Comparable
, puis trier un tableau de MovieScore
pour atteindre votre objectif.
ce n'est pas java 8
@ user10992206 Cette réponse fonctionne dans toutes les versions de Java
Comment utiliser une classe simple pour contenir les deux éléments de données et les conserver dans un seul tableau pour un tri plus facile. Le tri est pris en charge par la mise en œuvre du protocole Comparable
.
class Status implements Comparable<Status> { String status; float count; public Status(String status, float count) { this.status = status; this.count = count; } @Override public int compareTo(Status s) { if (this.count < s.count) { return 1; } else if (this.count > s.count) { return -1; } return 0; } } Status[] statusArray = new Status[finishStatusesJSON.size()]; for (int i = 0; i < finishStatusesJSON.size(); i++) { JSONObject finishStatusJSON = (JSONObject) finishStatusesJSON.get(i); Status status = new Status(finishStatusJSON.getString("status"), finishStatusJSON.getFloat("count")); statusArray[i] = status; } Arrays.sort(statusArray);
Ce n'est pas du tri !!
@ user10992206, attendez une seconde, j'y arrive. J'ai oublié de l'inclure.
@ user10992206, prise en charge du tri ajoutée
Vous pourriez peut-être utiliser une Map
type de tableau, où le K
serait le classe Float , tandis que le V
serait le String classe.
Ainsi, vous pouvez utiliser le put (K, V) , comme ci-dessous, puis triez correctement.
float count = finishStatusJSON.getFloat("count"); totalCount += count; map.put( count, finishStatusJSON.getString("status") );
Bien que, il semble que vous parler de traitement, pas de Java.
Erratum: Il serait peut-être préférable d'utiliser un SortedMap classe d'implémentation; car vous seriez en mesure de mettre un comparateur directement dans le constructeur, ou utilisez l'ordre naturel, et la Carte se triera d'elle-même.
Si vous souhaitez toujours utiliser un Map de mise en œuvre de la classe, alors je vous suggère d'utiliser keySet ()
, puis suivez le même algorithme que celui suggéré dans cette réponse .
Cependant, je suis sceptique quant à l'utilisation de ces classes dans Processing, car cela pourrait être dans fait invalide pour son cadre; mais s'il se compile et qu'il n'y a pas d'erreur / exception d'exécution, alors cela peut valoir la peine d'essayer.
mais ce n'est pas trié
Le traitement est inspiré de Java, mais il est encore loin de Java. Vous ne pouvez pas utiliser de méthodes de classe (statiques), par exemple.
J'ai édité mon message. Si les classes semblent fonctionner, vous devriez essayer avec un Classe de comparaison
Créez une classe simple qui contient les deux valeurs et utilisez-la dans votre tableau
Je voulais éviter de créer beaucoup plus de code. Est-ce difficile à réaliser?
Copie possible de Java - Trier un tableau en fonction des valeurs de un autre tableau?
@LeoLeontev c'est java basique, je ne peux pas utiliser ces 8 trucs ici
peut-être que je peux utiliser le JSONArray
finishStatusesJSON
pour trier?vous pouvez utiliser un
dictionnaire
pour trouver les valeurs du tableauString
en utilisant des valeurs flottantes comme clé . Il vous suffit de commander un tableau flottant et d'obtenir les valeurs de chaîne du dictionnaire (HasMap).