2016-03-20 19 views
2

Ich versuche, die Werte eines Arrays in ein anderes Array einzuordnen. Also die array1, die Werte (z. B. array1[3]) muss nach der Größe des Werts eingestuft werden und dann muss ein Wert von 1 bis 10 je nach der Größe der Zahl zugewiesen werden. Auf Rang zwischen 1 und 10.Ranking eines Arrays Werte von 1 bis 10, Java?

Ich habe versucht, Auswahl Art tun:

public static int[] doSelectionSort(int[] arr){ 

for (int i = 1; i < arr.length; i++) 
{ 
    int index = i; 
    for (int j = i + 1; j < arr.length - 1; j++) 
     if (arr[j] < arr[index]) 
      index = j; 

    int smallerNumber = arr[index]; 
    arr[index] = arr[i]; 
    arr[i] = smallerNumber; 

} 

Other than that, weiß nicht ich, wohin sie gehen. Ich habe 2d-Arrays ausprobiert, aber das ist verwirrend. Das Array1 würde in einer Spalte auf dem GUI-Bildschirm angezeigt, aber in zufälliger Reihenfolge entsprechend dem Programm. Aber das Ranking wird neben jedem Wert aus der Spalte array1 in der GUI angezeigt. Das Ranking muss nicht in der richtigen Reihenfolge angezeigt werden, sondern muss die Werte von array1 rangieren und neben dem Wert in der nächsten Spalte auf dem Bildschirm angezeigt werden.

+0

Haben Sie versucht 'Arrays.sort (array1);'? –

+0

Ja, muss Rang von 1 bis 10 zeigen, aber nicht in der Reihenfolge. Wenn also der Wert von array1 [1] 2 ist und array1 [2] 4 ist, würde es in der Spalte der Ränge erscheinen: 2,1. 1 ist das Höchste. Prost :) – TingAli

+1

Werden die Werte einzigartig sein? Wenn ja, könnten Sie eine Kopie davon in eine Liste kopieren, sie sortieren und dann die indexOf-Methode verwenden? – saml

Antwort

5

Eine Möglichkeit, diese Art von Problem zu lösen:

  • Shop die Paare von (value, index) in einem Array
  • sortieren das Array von Paaren von value
  • Erstellen der Anordnung von Reihen aus dem sortierte Reihe von Paaren

Etwas wie dieses:

public static int[] calculateRanks(int... arr) { 
    class Pair { 
     final int value; 
     final int index; 

     Pair(int value, int index) { 
      this.value = value; 
      this.index = index; 
     } 
    } 

    Pair[] pairs = new Pair[arr.length]; 
    for (int index = 0; index < arr.length; ++index) { 
     pairs[index] = new Pair(arr[index], index); 
    } 

    Arrays.sort(pairs, (o1, o2) -> -Integer.compare(o1.value, o2.value)); 

    int[] ranks = new int[arr.length]; 
    int rank = 1; 
    for (Pair pair : pairs) { 
     ranks[pair.index] = rank++; 
    } 

    return ranks; 
} 

Dies setzt voraus, dass die Werte eindeutig sind, so dass die Ränge auch eindeutig sind. Wenn doppelte Werte vorhanden sein können, können Sie den letzten Schritt zum Einstellen der Ränge entsprechend anpassen.

Zum Beispiel, wenn es mindestens ein Wert in dem Array ist, so etwas wie dies funktionieren würde:

int[] ranks = new int[arr.length]; 
    ranks[pairs[0].index] = 1; 
    for (int i = 1; i < pairs.length; ++i) { 
     if (pairs[i].value == pairs[i - 1].value) { 
      ranks[pairs[i].index] = ranks[pairs[i - 1].index]; 
     } else { 
      ranks[pairs[i].index] = i + 1; 
     } 
    } 
+0

Was passiert, wenn die Ränge gleich sind? Wie würde ich das umsetzen? – TingAli

+0

In diesem Fall wird der Rang nicht erhöht, wenn der Wert gleich dem vorherigen ist, anstatt den Rang in jeder Iteration zu erhöhen. – janos

+0

@TingAli Ich habe eine Beispielimplementierung für diesen Fall hinzugefügt – janos

1

Sie könnten das Array als einfachste Lösung sortieren. Sie müssten keine Rangspalte haben, da sie bereits in Ordnung ist. Wie du es willst.

int[] array1 = new int[]{10, 22, 45, 6, 7, 25}; 
int[][] ranked = new int[array1.length][2]; 
for(int i=0; i < array1.length; i++) 
    ranked[i][0] = array1[i]; 
Arrays.sort(array1); 

for(int i=0; i < array1.length; i++) 
    for(int n=0; n < array1.length; n++) 
     if(ranked[n][0] == array1[i] && ranked[n][1] == 0) 
      ranked[n][1] = array1.length-i; 
/* Result 
10 # 4 
22 # 3 
45 # 1 
6 # 6 
7 # 5 
25 # 2 
*/ 
+0

Was stelle ich statt ".... deine Rangwerte" ein ... verwirrt. Prost :) – TingAli

+0

Es sollte jetzt funktionieren, reparierte es ein letztes Mal. 'array1' wird zum temporären Array, kopiert aber die Werte in der ursprünglichen Reihenfolge in die Rangliste. Doppelte Werte spielen keine Rolle. –

1

Sie können über array1 laufen und speichern ihre Werte in einem TreeMap als Schlüssel und der Iterieren Zähler (Array-Index hier) als Wert. TreeMap sortiert sich anhand der bereitgestellten Schlüssel; Sie können über die TreeMap iterieren und die Werte drucken, das sind Ihre entsprechenden Ränge.

int[] array1 = new int[]{10, 22, 45, 6, 7, 25}; 
TreeMap<Integer,Integer> map = new TreeMap<>(); 
for(int i=0;i<array1.length;i++) { 
    map.put(array1[i],i); 
} 
for(int value : map.values()) { 
    //print ranks in order of array values 
    System.out.println(value); 
} 
Verwandte Themen