2016-02-13 3 views
1

У меня есть строка, которую я конвертирую в ArrayList с целью подсчета количества конкретных значений в списке.Строка для отображения числа вхождений уникальных значений в Java ArrayList

Моя строка может выглядеть следующим образом:

String myString = "Living Room, Bedroom, Bedroom, Bedroom, Bathroom, Bathroom, Family Room." 

Я в настоящее время найти количество вхождений уникальных значений в этом случае:

Map<String, Long> count = Stream.of(myString.split(",")).collect(Collectors.groupingBy(w -> w, Collectors.counting())); 

Что лучший способ пойти об этом так что я могу напечатать что-то в строках «Мой дом включает в себя 1 гостиную, 3 спальни, 2 ванные комнаты и 1 семейный номер».

На данный момент мое решение заключается в следующем. Я еще не принял ответ, потому что я думаю, как я последовал через немного неуклюжим:

String newDescription = "My Home includes "; 

public String getDescription(){ 
    String myDescription = home.getDescription(); 

    Map<String, Long> count = Stream.of(myDescription.split(",")).collect(Collectors.groupingBy(w -> w, Collectors.counting())); 

    for (Map.Entry<String, Long> entry : count.entrySet()){ 
     newDescription = newDescription + entry.getValue() + " " + entry.getKey() + "(s), "; 
    } 
    return newDescription; 
} 

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

public ArrayList convertDescription(){ 
    //getDescription is inherited from another class to provide a string like the myString example above 
    String myDescription = home.getDescription(); 

    ArrayList<String>Map<String, listDescriptionLong> =count new= ArrayList<String>(ArraysStream.asListof(myDescription.split(","))); 

    int livingRoomOccurrences = Collections.frequencycollect(listDescription, "Living Room"); 
    int bedroomOccurrences = CollectionsCollectors.frequencygroupingBy(listDescription, "Bedroom"); 
    int bathroomOccurrencesw =-> Collections.frequency(listDescriptionw, "Bathroom"); 
    int familyRoomOccurrences = CollectionsCollectors.frequencycounting(listDescription, "Family Room"); 
    int kitchenOccurrences = Collections.frequency(listDescription, "Kitchen"); 
    int walkInClosetOccurrences = Collections.frequency(listDescription, "Walk-in Closet"); 
    //not sure what I should return to make it easy to override getDescription with the proper string formatting 
    return listDescription; 
} 

public String getDescription(){ 
    return home.getDescription(); 
} 

ответ

1

Я предлагаю вам получить частоту всех элементов и извлечь из них то, что вам нужно, а не сканировать коллекцию снова и снова.

Map<String, Long> count = Stream.of(myString.split(",")) 
          .collect(Collectors.groupingBy(w -> w, Collectors.counting()); 
+0

Хорошо, это выглядит более элегантно. Я пытаюсь получить больше информации о синтаксисе w -> w ... Я новичок в java – user25976

+1

@ user25976, это функция, которая возвращает все, что вам дано. Это необходимо, поскольку первая функция/аргумент 'groupingBy' должна предоставить ключ, но вы хотите, чтобы ключ был неизменным, поэтому функция ничего не делает. например скажем, вы сделали 'w -> w.toLowerCase()' он будет считать слова в нижнем регистре, чтобы случай был проигнорирован. Это означает, что '' и '' и '" И "' и '" AND "' будут считаться как '' и '' –

+0

@ user25976, вы могли бы сделать w ~ wwength()' Это сделало бы ключ, длина слова вместо самих слов. Или вы можете так «w -> w.charAt (0)», и вместо этого ключ будет первой буквой каждого слова. –

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