2017-01-15 3 views
3

У меня есть следующие списки:Как выполнить сортировку списка hashmap?

Map<String, Integer> map = new HashMap<String, Integer>(); 
Map<String, Map<Integer, Integer>> map2 = new HashMap<String, Map<Integer, Integer>>(); 

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

map.entrySet().stream().sorted(Map.Entry.<String, Integer>comparingByValue() 
    .reversed()).limit(1000).forEach(System.out::println); 

возвращает список, который сортируется на основе целого числа, а также имя :

team1=1511 
team4=1106 
team2=805 
team3=792 

это означает, что team1 имеет первое место со временем 1211 и team4 второе место со временем 1106 и так далее.

Теперь в моем map2 я хотел бы быть в состоянии иметь один и тот же список в зависимости от времени водителей, но он должен сортировать так:

team1=1511 
team4=1106 
team1=1010 
team2=905 
team2=892 
team3=750 
team3=740 
team4=600 

это означает, что team1 имеет первое место с время 1511, затем команда4 со временем 1106, затем снова команда1 со временем 1010 и так далее.

(в основном, у вас есть команда, и каждая команда имеет водитель по крайней мере 2 и после выполнения некоторых вычислений вы хотите, чтобы иметь возможность видеть, кто выиграл гонку)

для map2 я использую следующий для сортировки и return:

map2.entrySet().stream().sorted(Map.Entry.<String, Map<Integer, Integer>>comparingByKey() 
    .reversed()).limit(1000).forEach(System.out::println); 

но это не возвращает правильный результат.

Я хочу знать, можно ли это сделать с помощью hashmap или, возможно, даже с помощью ArrayList?

+0

Что вам нужно сделать, чтобы вычислить время команды в map2? –

+0

@ GrzegorzGórkiewicz Я сделал вычисления в другом методе, я просто хочу разобраться в том, как я объяснил выше. –

+0

'new HashMap >();' ist не такая же структура данных, как 'new HashMap ();' ... Вот почему я не знаю, где вы поместите эти времена;) –

ответ

0

Другой подход ... почему бы не отдельный класс?

public class Standing implements Comparable<Standing> { 

    private String team; 
    private Integer time; 

    public Standing(String team, Integer time) { 
     this.team = team; 
     this.time = time; 
    } 

    public String getTeam() { 
     return this.team; 
    } 

    public Integer getTime() { 
     return this.time; 
    } 

    @Override 
    public String toString() { 
     return this.team + "=" + this.time; 
    } 

    public int compareTo(Standing standing) { 
     return (this.time).compareTo(standing.getTime()); 
    } 
} 

Здесь я хотел бы использовать:

Map<String, ArrayList<Integer>> map2 = new HashMap<String, ArrayList<Integer>(); 

таким образом:

TreeSet<Standing> standingSet = new TreeSet<Standing>(); 
for (String team : map2.keySet()) { 
    standingSet.add(new Standing(team, map2.get(team).get(0))); 
    standingSet.add(new Standing(team, map2.get(team).get(1))); 
} 

for (Standing standing : standingSet) { 
    System.out.println(standing); 
} 
+0

it doest work, я получаю ошибку для Map > map2 = new HashMap >(); –

+0

Это должно быть 'Map > map2 = new HashMap >();' вместо этого. –

+0

на самом деле не эта ошибка: несколько маркеров в этой строке \t - неверное количество аргументов для типа ArrayList ; его нельзя параметризовать аргументами \t - Неправильное количество аргументов для типа ArrayList ; она не может быть параметрироваться с аргументами

0

Предполагая, что map2 содержит:

team1: { 
    1: 1506, 
    2: 1010 
}, 
team4: { 
    1: 1106, 
    2: 600 
} 

... то вы можете получить его отсортированы по делает:

List<DriverResult> results = map2.entrySet().stream() 
    .flatMap(e -> e.getValue().entrySet().stream() 
     .map(e2 -> new DriverResult(e.getKey(), e2.getKey(), e2.getValue())) 
    ) 
    .sorted(Comparator.comparing(DriverResult::getTime)) 
    .collect(Collectors.toList()); 

И этот вспомогательный класс:

public class DriverResult { 
    private String team; 
    private int number; 
    private int time; 

    public DriverResult(String team, int number, int time) { 
    this.team = team; 
    this.time = time; 
    this.number = number; 
    } 

    public int getTime() { 
    return time; 
    } 
} 
Смежные вопросы