сортировка 2d структуры данных в Java - PullRequest
3 голосов
/ 24 августа 2011

Мне нужно отсортировать 2d пару ключ / значение по значению.Я прочитал много ссылок на эту тему в Интернете и закончил тем, что написал свой собственный класс, чтобы сделать это с помощью HashMaps (см. Ниже).Я поместил код в сжатый рабочий класс, который воспроизводит проблему с минимальным количеством кода, чтобы вы могли просто вырезать и вставить его в свою среду IDE для быстрой диагностики.

Как видите, метод, который янаписал правильно сортирует значения, прежде чем они будут введены в sortedMap.Однако по какой-то причине их значения затем снова упорядочиваются другим способом, когда я пытаюсь впоследствии выполнить итерацию по sortedMap.

Может кто-нибудь показать мне, как исправить приведенный ниже код, чтобы я выполнял итерацию по полученным 2D-даннымобъект, который дает мне мои данные в порядке убывания?


РЕДАКТИРОВАТЬ: Переписано с использованием TreeMaps, и до сих пор возникают аналогичные проблемы.Вот переписанный код:

import java.util.*;

public class HashMapDemo {
    public static void main(String args[]) {

        // Code that creates and populates the unordered HashMap:
        TreeMap<Integer, Double> unSortedMap = new TreeMap<Integer, Double>();
        unSortedMap.put(1343, 0.521851);
        unSortedMap.put(1950, -0.301208);
        unSortedMap.put(3667, -0.0280762);
        unSortedMap.put(3879, 0.154724);
        unSortedMap.put(4124, 0.022583);

        // Code that calls the ordering method:
        TreeMap<Integer, Double> sortedMap = new TreeMap<Integer, Double>(
                sortTreeMap(unSortedMap));

        // Code that iterates through the "sorted" hashmap.
        System.out.println("now iterate through sortedMap: ");
        for (Integer key : sortedMap.keySet()) {
            System.out.println("key, sortedMap.get(key) are:  " + key + ", "
                    + sortedMap.get(key));
        }
    }

    // Code for the ordering method. Note that the println tests indicate that
    // this method is correctly sorting the key/value pairs in the hashmap:
    private static TreeMap<Integer, Double> sortTreeMap(
            TreeMap<Integer, Double> input) {

        System.out
                .println("input.size() upon entering sortHasMap() function is: "
                        + input.size());
        int startSize = input.size();

        // create a hashmap to store sorted output
        TreeMap<Integer, Double> sortedMap = new TreeMap<Integer, Double>();

        // repeat the following process once for every key/value pair in the
        // hashmap
        for (int i = 0; i < startSize; i++) {
            int mySize = input.size();
            System.out.println("mySize is: " + mySize);
            double maxVal = Double.NEGATIVE_INFINITY;
            int maxKey = 0;

            // iterate through each key in hashmap to find key/value of max
            // value
            for (Integer key : input.keySet()) {
                if (maxVal < input.get(key)) {
                    maxVal = input.get(key);
                    maxKey = key;
                }
            }

            // add key/value of max of that iteration to sorted map and remove
            // from input before next iteration
            sortedMap.put(maxKey, maxVal);

            input.remove(maxKey);

            System.out.println("sortedMap.put(maxKey, maxVal) are: " + maxKey
                    + ", " + maxVal);
        }
        return sortedMap;
    }
}

Ответы [ 2 ]

5 голосов
/ 24 августа 2011

Вам нужно только две строки , чтобы достичь того, что вы хотите. Вот эти две строки:

    Map<Integer, Double> sortedMap = new TreeMap<Integer, Double>(new Comparator<Integer>() {
        public int compare(Integer o1, Integer o2) {
            return map.get(o2).compareTo(map.get(o1)); // reverse order of values
        }
    });
    sortedMap.putAll(map);

Вот полный исполняемый код:

public static void main(String[] args) {
    final Map<Integer, Double> map = new HashMap<Integer, Double>();
    map.put(1343, 0.521851);
    map.put(1950, -0.301208);
    map.put(3667, -0.0280762);
    map.put(3879, 0.154724);
    map.put(4124, 0.022583);
    Map<Integer, Double> sortedMap = sortMap(map);

    for (Map.Entry<Integer, Double> entry : sortedMap.entrySet()) {
        System.out.println(entry.getKey() + ", " + entry.getValue());
    }
}

public static Map<Integer, Double> sortMap(final Map<Integer, Double> map) {
    Map<Integer, Double> sortedMap = new TreeMap<Integer, Double>(new Comparator<Integer>() {
        public int compare(Integer o1, Integer o2) {
            return map.get(o2).compareTo(map.get(o1));
        }
    });
    sortedMap.putAll(map);
    return sortedMap;
}

Выход:

1343, 0.521851
3879, 0.154724
4124, 0.022583
3667, -0.0280762
1950, -0.301208

Примечания: вы указываете , как вы хотите упорядочить записи в TreeSet, передавая компаратор, который вы хотите использовать, в конструктор. Реализация TreeSet сделает все остальное.

Другие примечания:

  • Лучший способ перебирать ключи / значения карты - перебирать Map.entrySet()
  • Всегда используйте абстрактный тип для своих переменных - например, Map<?, ?> myMap , а не конкретную реализацию (например, HashMap<?, ?> myMap)

Вот общая версия метода sortMap, который будет сортировать любую подходящую карту на основе обратного порядка значений:

public static <K, V extends Comparable<V>> Map<K, V> sortMap2(final Map<K, V> map) {
    Map<K, V> sortedMap = new TreeMap<K, V>(new Comparator<K>() {
        public int compare(K o1, K o2) {
            return map.get(o2).compareTo(map.get(o1));
        }
    });
    sortedMap.putAll(map);
    return sortedMap;
}
4 голосов
/ 24 августа 2011

Используйте TreeMap . Это SortedMap, который использует естественное упорядочение ключей. В вашем случае он будет заказывать по клавише Integer.

Это делает сортировку для вас.

java.util.HashMap неупорядочено.

Этот класс не дает никаких гарантий относительно порядка карты; в В частности, это не гарантирует, что порядок останется постоянным со временем.

EDIT После правильного прочтения вопроса

Используйте Comparator для конструктора TreeMap, который сравнивает значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...