2015-06-10 4 views
1

Я пытаюсь объединить строки с тем же именем вместе.Присоединиться к строкам начинаются с одного и того же имени

С текущим состоянием я получаю выход ниже.

Я попытался изменить значение объекта на карте к списку, но затем я получаю:

Метод поставил (String, List) в типе картах не применяется для аргументов (String, String)

Выходной

Ravensbusch 11:38 18:38 23:38 
apple 11:54 18:54 23:53 
table 11:50 18:50 23:49 
markt haus 11:46 18:46 23:45 
Rathausmarkt 11:41 18:41 23:40 

Выход должен быть таким; При таком порядке, как в буферных Список_массивах тоже:

Ravensbusch 04:41 ..... 23:38 
Rathausmarkt 04:43 .... 23:40 
markt haus 04:48 .... 18:46 23:45 
table 04:52 .... 23:49 
apple 04:56 ..... 23:53 

Код:

private static final Pattern pattern = 
     Pattern.compile("^ *(.+?)(+(?:[01][0-9]|2[0-3]):[0-5][0-9])+ *$"); 

public static void main(String[] args) { 

    ArrayList<String> buffer = new ArrayList<String>(); 

    buffer.add("Ravensbusch street 04:41 05:41 06:09 06:38 07:08 07:38 08:08 08:38 09:08 09:38 10:08 10:38 11:08 11:38"); 
    buffer.add("Rathausmarkt 04:43 05:43 06:11 06:41 07:11 07:41 08:11 08:41 09:11 09:41 10:11 10:41 11:11 11:41"); 
    buffer.add("markt haus 04:48 05:48 06:16 06:46 07:16 07:46 08:16 08:46 09:16 09:46 10:16 10:46 11:16 11:46"); 
    buffer.add("table 04:52 05:52 06:20 06:50 07:20 07:50 08:20 08:50 09:20 09:50 10:20 10:50 11:20 11:50"); 
    buffer.add("apple 04:56 05:56 06:24 06:54 07:24 07:54 08:24 08:54 09:24 09:54 10:24 10:54 11:24 11:54"); 


    buffer.add("Ravensbusch street 12:08 12:38 13:08 13:38 14:08 14:38 15:08 15:38 16:08 16:38 17:08 17:38 18:08 18:38"); 
    buffer.add("Rathausmarkt 12:11 12:41 13:11 13:41 14:11 14:41 15:11 15:41 16:11 16:41 17:11 17:41 18:11 18:41"); 
    buffer.add("markt haus 12:16 12:46 13:16 13:46 14:16 14:46 15:16 15:46 16:16 16:46 17:16 17:46 18:16 18:46"); 
    buffer.add("table 12:20 12:50 13:20 13:50 14:20 14:50 15:20 15:50 16:20 16:50 17:20 17:50 18:20 18:50"); 
    buffer.add("apple 12:24 12:54 13:24 13:54 14:24 14:54 15:24 15:54 16:24 16:54 17:24 17:54 18:24 18:54"); 

    buffer.add("Ravensbusch street 19:08 19:38 20:08 20:38 21:38 22:38 23:38"); 
    buffer.add("Rathausmarkt 19:11 19:41 20:11 20:40 21:40 22:40 23:40"); 
    buffer.add("markt haus 19:16 19:46 20:16 20:45 21:45 22:45 23:45"); 
    buffer.add("table 19:20 19:50 20:20 20:49 21:49 22:49 23:49"); 
    buffer.add("apple 19:24 19:54 20:24 20:53 21:53 22:53 23:53"); 


    Map<String, String> stops = new HashMap<>(); 

    for (String line : buffer) { 

      Matcher matcher = pattern.matcher(line); 
      if (matcher.find()) { 
       if (stops.containsKey(matcher.group(1))) { 
        stops.put(matcher.group(1), stops.get(matcher.group(1)) + matcher.group(2)); 
       } else { 
        stops.put(matcher.group(1), matcher.group(2).trim()); 
       } 
      }       
    } 

    ArrayList<String> result = new ArrayList<>(stops.keySet().size()); 
    for (String key : stops.keySet()) { 
     result.add(key + " " + stops.get(key)); 
    } 

    for(String output: result){ 
     System.out.println(output); 
    }     
} 

ответ

1

Создайте объект, который берет строку, содержащую место и время, как один String. В конструкторе разделите строку и проанализируйте каждую переменную. Если DateFormat.parse() выдает исключение, вы знаете, что это имя, поэтому добавьте его к переменной имен и наоборот. Вот пример этого:

public class PlaceTime { 
    StringBuilder place = new StringBuilder(); 
    Queue<String> times = new PriorityBlockingQueue<>(); 

    public PlaceTime(String placeTime) { 

     DateFormat dateFormat = new SimpleDateFormat("HH:mm"); 
     for (String i:placeTime.split(" ")) { 
      try { 
       dateFormat.parse(i); 
       //No exception, add as time 
       times.add(i); 
      } catch (Exception e) { 
       //Exception, add as place name 
       place.append(i).append(" "); 
      } 
     } 
    } 

    public String getPlace() { 
     return place.toString(); 
    } 

    public Queue<String> getTimes() { 
     return this.times; 
    } 
} 

Теперь все, что вам нужно сделать, это создать PlaceTime объекты для каждой строки, добавьте получить место с помощью getPlace, и получить время с помощью getTimes. Добавьте эти значения на карту, чтобы избежать дублирования, и вы получите место со временем. Вот пример этого:

Map<String, Queue<String>> map = new LinkedHashMap<>(); 

List<PlaceTime> list = new ArrayList<>(
      Arrays.asList(
      new PlaceTime("Ravensbusch street 04:41 05:41 06:09 06:38 07:08 07:38 08:08 08:38 09:08 09:38 10:08 10:38 11:08 11:38"), 
      new PlaceTime("Ravensbusch street 04:41 05:41 06:09 06:38 07:08 07:38 08:08 08:38 09:08 09:38 10:08 10:38 11:08 11:38"), 
      new PlaceTime("Ravensbusch street 19:08 19:38 20:08 20:38 21:38 22:38 23:38"))); 

for (PlaceTime t:list) { 
    if (map.containsKey(t.getPlace())) { 
     //If the map already contains an entry for the place, add the times to the array 
     map.get(t.getPlace()).addAll(t.getTimes()); 
    } else { 
     //Map does not contain entry for place, create a new entry 
     map.put(t.getPlace(), t.getTimes()); 
    } 
} 

//Print out contents of map 
for (Entry<String, Queue<String>> entry:map.entrySet()) { 
    System.out.println(entry.getKey()); 
    System.out.println(entry.getValue()); 
} 

Этот вывод будет:

Ravensbusch street 
[04:41, 05:41, 06:09, 06:38, 07:08, 07:38, 08:08, 08:38, 09:08, 09:38, 10:08, 10:38, 11:08, 11:38, 12:08, 12:38, 13:08, 13:38, 14:08, 14:38, 15:08, 15:38, 16:08, 16:38, 17:08, 17:38, 18:08, 18:38, 19:08, 19:38, 20:08, 20:38, 21:38, 22:38, 23:38] 
+0

Это ковшики спасибо вам, но есть ли способ сохранить порядок ArrayList, когда я тусклый для вывода результата в Карта? – TheBook

+0

Список на карте поддерживает первоначальный порядок вставки. Вы хотели бы, чтобы время на карте отсортировало форму как можно скорее? – Ian2thedv

+0

Да, просьба указать порядок имени остановки, как он есть в списке. Я добавил новое значение в список, например 'love street'. В списке у них есть правильный порядок «улица Равенсбуш», а затем стоимость улицы любви, но позже, когда я прохожу через карту, я получаю неправильный порядок как «улица любви, а затем улица Равенсбуш» – TheBook