2

I'm creating a console game in Java. And I want to keep track of the scores and names.

I've already created two arrays.

String[] PlayerNames = {"Bob", "Rick", "Jack"}; // just an example
int[] PlayerScores = {40, 20, 60}; // just an example

I want to sort their scores, but also know who the score belongs to, and then print it out like this:

 Jack      60
 Bob       40      
 Rick      20
1
  • 1
    FYI, map could be your friend here. Also, what do you base on to sort the users (PlayerNames)? Commented Nov 15, 2018 at 19:29

2 Answers 2

1

Create a map with the player names as the keys and the scores as the values, then sort the map based on the values:

public static void main(String[] args) {
    Map<String, Integer> unsortedMap = new HashMap<String, Integer>();
    unsortedMap.put("Jack", 60);
    unsortedMap.put("Bob", 40);
    unsortedMap.put("Rick", 20);

    Map<String, Integer> sortedMap = sortByValue(unsortedMap);
    printMap(sortedMap);
}

private static Map<String, Integer> sortByValue(Map<String, Integer> unsortMap) {

    // 1. Convert Map to List of Map
    List<Map.Entry<String, Integer>> list =
            new LinkedList<Map.Entry<String, Integer>>(unsortMap.entrySet());

    // 2. Sort list with Collections.sort(), provide a custom Comparator
    //    Try switch the o1 o2 position for a different order
    Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
        public int compare(Map.Entry<String, Integer> o1,
                           Map.Entry<String, Integer> o2) {
            return (o1.getValue()).compareTo(o2.getValue());
        }
    });

    // 3. Loop the sorted list and put it into a new insertion order Map LinkedHashMap
    Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
    for (Map.Entry<String, Integer> entry : list) {
        sortedMap.put(entry.getKey(), entry.getValue());
    }

    /*
    //classic iterator example
    for (Iterator<Map.Entry<String, Integer>> it = list.iterator(); it.hasNext(); ) {
        Map.Entry<String, Integer> entry = it.next();
        sortedMap.put(entry.getKey(), entry.getValue());
    }*/


    return sortedMap;
}

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());
    }
}

Note: see https://www.mkyong.com/java/how-to-sort-a-map-in-java/ for more details.

Sign up to request clarification or add additional context in comments.

Comments

0

You can use a hashmap for this. Use each name from playerNames as a key and create a list for the values (in case two or more players with the same name get a score). A hashmap allows only one value per key, which is why you should create a list of integers for the scores.

Map<String, List<Integer>> scoreboard = new HashMap<>();

1 Comment

You will never have more than one player with the same name. Maps don't allow duplicate keys.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.