0

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
2
  • The best way to do this is to put both values ("players" and "goals") into an object (a class you make) and sort on that. Otherwise, show what code you're written and we'll help. Commented Oct 5, 2017 at 2:05
  • Suggestion - read up on the java.util.Comparator interface: docs.oracle.com/javase/7/docs/api/java/util/Comparator.html Commented Oct 5, 2017 at 2:05

2 Answers 2

1
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
Sign up to request clarification or add additional context in comments.

Comments

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.