2013-11-17 2 views
0

Итак, мне нужно отсортировать строки на основе двух ключей на Java.Сортировка строк с 2 ключами

Я получаю исходный ввод текста, содержащий имена, например: city_name person_name.

Цель состоит в том, чтобы в первую очередь сортировать города по алфавиту, а вторичные имена людей. Затем нужно показать, сколько людей с этим конкретным именем живут в этом городе.

Таким образом, с входным как:

C Zeke 
A John 
C Pete 
B Lisa 
A John 
B John 
C Pete 
C Pete 
B Lisa 

он должен выводить

A John 2 
B John 1 
B Lisa 2 
C Pete 3 
C Zeke 1 

Это оставило меня абсолютно ошеломлен. Есть идеи?

+4

Вы r классов, реализующих интерфейс Comparable? Если это так, то просто скопируйте метод compareTo, чтобы сначала сравнить данные, хранящиеся в поле первичного ключа, и если они равны (и * только *, если оба поля первичного ключа равны), сравните поле вторичного ключа. Вот и все. –

+0

«Этот вопрос показывает исследовательскую работу, полезен и ясен». № –

ответ

1

Только что отредактирован в соответствии с комментариями. MultiKeyMap не является частью JDK :(.

Вы можете использовать MultiKeyMap или Map<String,Integer> и сохранить город и имя как ключи, и количество встреч в качестве значения. Тогда вы просто перебирать записи изображения карты и напечатать значения

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

for (String cityAndName : input) { 
    String city = // split and get city 
    String name = // split and get name 
    Integer noOfEncounters = 0; 
    if (map.containsKey(city+"_"+name)) { 
     noOfEncounters = map.get(city+"_"+name); 
     noOfEncounters++; 
    } 
    map.put(city+"_"+name,noOfEncounters); 
} 

Еще лучше было бы, если у вас есть объект, который wrapps город и имя. что-то вроде Person. Тогда вы просто переопределить хэш-код и составляет метод рассчитывается с атрибутами city и name, и вам не нужно делать эту уродливую конкатенацию.

+0

Это не часть JDK. –

+0

Спасибо, это помогло мне. Оказалось, я просто был идиотом и слишком много думал. – Yananas

4

Если предположить, что у вас есть класс Person, который содержит person_name и city_name, просто поместите их в List и сортировать их с помощью Collections.sort(List, Comparator) с помощью реализации пользовательских Comparator, что сначала проверяет города, а затем на имя:

Collections.sort(people, new Comparator<Person>() { 
    compare(Person p1, Person p2) { 
     int c = p1.getCity().compareTo(p2.getCity()); 
     return (c == 0) ? p1.getName().compareTo(p2.getName()) : c; 
    } 
}); 

Обратите внимание, что вам, возможно, придется добавить null чеков. Также подумайте о сравнении строк через compareToIgnoreCase.

Смежные вопросы