Как отсортировать список в hashmap по элементам одного ключа - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь создать хэш-карту, которая будет включать в себя имя объекта (ключ) и список всех объектов с этим именем. Примерно так:

"bob" = obj1, obj2

"Mark" = obj3

Я создал метод сортировки, чтобы попытаться выполнить это, но я не могу заставить его работать:

public class sorter {

    public static Object obj = new Object("mark");
    public static Object obj1 = new Object("bob");
    public static Object obj2 = new Object("mark");
    public static Object obj3 = new Object("mark");

    public static List<Object> objects = new ArrayList<Object>();

    private static Map<String, List<Object>> map = new HashMap<String, List<Object>>();

    public static List<Object> tempList = new ArrayList<Object>();

    public static String key;
    public static int values;

    public static void sort(List<Object> objects) {

        for(int i = 0; i<objects.size(); i++) {

            key = objects.get(i).getName();
            if(map.containsKey(key)) {
                map.get(key).add(objects.get(i));
            }
            else {
                tempList.add(objects.get(i));
                map.put(key, tempList);
            }
            //reset
            //key = null;
        }
    }

    public static void main(String[]args) {
        objects.add(obj);
        //objects.add(obj1);
        //objects.add(obj2);
        //objects.add(obj3);
        sort(objects);
        System.out.println(map.get("mark"));
    }
}

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Вы можете использовать потоки Java8, как показано ниже:

    public static void sort(List<Object> objects) {
       map =objects.stream().collect(Collectors.groupingBy((o) -> o.getName()));
    }
0 голосов
/ 28 апреля 2018

Есть несколько проблем с вашим кодом на данный момент. давайте пройдемся по ним:

  1. Вы не сортируете, вы группируете.
  2. вызов класса sorter не является осмысленным именем и не соответствует соглашению об именах Java.
  3. new Object("mark"); не будет компилироваться, так как существует только один конструктор для класса Object, и это конструктор по умолчанию, без параметров.
  4. objects.get(i).getName(); не скомпилируется, поскольку в классе объектов нет метода getName.
  5. старайтесь по возможности избегать использования класса Object, и в этом случае имеет смысл создать класс Person.
* * Пример тысяча двадцать-один: * * 1 022
class Person {
    private String name;
    // ... some additional fields
    @Override
    public String toString() {
        return "Person1{" +
                "name='" + name + '\'' +
                '}';
    }

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

Тогда ваш Sorter класс становится:

class Grouping {

    public static Person obj = new Person("mark");
    public static Person obj1 = new Person("bob");
    public static Person obj2 = new Person("mark");
    public static Person obj3 = new Person("mark");

    public static List<Person> objects = new ArrayList<>();

    private static Map<String, List<Person>> map = new HashMap<>();

    public static void groupByName(List<Person> objects) {
       map = objects.stream().collect(Collectors.groupingBy(Person::getName));
       // group by the person name
    }


    public static void main(String[]args) {
        objects.add(obj);
        objects.add(obj1);
        objects.add(obj2);
        objects.add(obj3);
        groupByName(objects);
        System.out.println(map.get("mark"));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...