Reputation: 15
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
Upvotes: 0
Views: 87
Reputation: 59
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
Upvotes: 0
Reputation: 299
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
Upvotes: 1