简体   繁体   中英

Sorting two separate Java arrays by value of one array

I am currently trying to sort two separate arrays by value then by alphabetical name. How can I do that?

String[] players = new String[5];
int[]goalsByPlayer = new int[5];
players = {a, b, c, d, e};
goalsByPlayer = {3, 0, 0, 0, 0};

1. a 3 goals
2. b 0 goals
3. c 0 goals
4. d 0 goals
5. e 0 goals

If I changed the amount of goals c has to 4, then the list would expected to be...

1. c 4 goals
2. a 3 goals
3. b 0 goals
4. d 0 goals
5. e 0 goals

Please send suggestions!

EDIT: Here is the code I've written.

for (int w = 0; w < number; w++) {
                            goalsByPlayer[w] *= -1;
                        }

                        Arrays.sort(sort);

                        for (int w = 0; w < number; w++) {
                            goalsByPlayer[w] *= -1;
                        }

for (int p = 0; p < number; p++) {

                            System.out.println((p + 1) + ". " + players[p] + " " + goalsByPlayer[p] + " goals");


                        }

I am just unaware on how to have the strings match their integers in the array.

Actual output:

    1. a 4 goals
    2. b 3 goals
    3. c 0 goals
    4. d 0 goals
    5. e 0 goals
public static void main(String[] args) {
    // Input data
    String[] players = {"a","b","c","d","e"};
    int[] goalsByPlayer = {3,0,0,4,0};

    // Put all of them into Map
    Map<String, Integer> unsortMap = new HashMap<>();
    for (int i = 0; i < players.length; i++) {
        unsortMap.put(players[i], goalsByPlayer[i]);
    }

    System.out.println("Unsort Map......");
    printMap(unsortMap);

    // Sort by value with reverse order
    Map sorted = unsortMap.entrySet().stream()
        .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
            (oldValue, newValue) -> oldValue, LinkedHashMap::new));

    System.out.println("\nSorted Map......By Value");
    printMap(sorted);
}

// print a map
public static <K, V> void printMap(Map<K, V> map) {
    for (Map.Entry<K, V> entry : map.entrySet()) {
        System.out.println("Key : " + entry.getKey()
            + " Value : " + entry.getValue());
    }
}

Output

Unsort Map......
Key : a Value : 3
Key : b Value : 0
Key : c Value : 0
Key : d Value : 4
Key : e Value : 0

Sorted Map......By Value
Key : d Value : 4
Key : a Value : 3
Key : b Value : 0
Key : c Value : 0
Key : e Value : 0

Add them to a map and use streams that are available in Java 8.

String[] players = { "a", "b", "c", "d", "e" };
int[] goalsByPlayer = { 3, 0, 0, 4, 0 };
Map<String, Integer> map = new HashMap<String, Integer>();
for (int i = 0; i < players.length; i++) map.put(players[i], goalsByPlayer[i]);
Map<String, Integer> sortedMap = new LinkedHashMap<>();
map.entrySet().stream().sorted(Map.Entry.<String, Integer>comparingByValue().reversed()).forEachOrdered(e -> sortedMap.put(e.getKey(), e.getValue()));
for (String key : sortedMap.keySet()) System.out.println("Player: " + key + " goals: " + sortedMap.get(key));

Here is the output

Player: d goals: 4
Player: a goals: 3
Player: b goals: 0
Player: c goals: 0
Player: e goals: 0

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM