Поиск в массиве списка наиболее распространенных строк - PullRequest
4 голосов
/ 18 февраля 2010

Мне было интересно, как я могу найти ArrayList of Strings, чтобы найти наиболее часто встречающееся «место назначения» в созданном мной «Объекте маршрута» (который содержит список различных мест назначения).

Пока у меня есть:

public static String commonName(ArrayList<Itinerary> itinerary){

    int count = 0;
    int total = 0;

    ArrayList<String> names = new ArrayList<String>();
    Iterator<String>itr2 = names.iterator();

    while(itr.hasNext()){ 

        Itinerary temp = itr.next();  

        if(temp.iterator().hasNext()){ //if its has destinations

                // Destination object in itinerary object 
                Destination temp2 = temp.iterator().next(); 
                String name = temp2.getDestination().toLowerCase().replace(" ", "");

                if(names.contains(name)){
                    count = count + 1;
                    //do something with counting the occurence of string name here
                }

У меня проблемы с созданием алгоритма поиска в массиве наиболее часто встречающейся строки или строк, если есть связь; а затем отображает номер «объекта маршрута» (значение параметра), в котором находится строка. Любая помощь будет отличной, спасибо !!

Ответы [ 4 ]

8 голосов
/ 18 февраля 2010

Я бы сделал HashMap<String,Integer>. Затем я должен был пройти каждый маршрут, и если пункт назначения не был на карте, я бы создал запись с помощью put (destination, 1), в противном случае я бы увеличил счет, который был там, с помощью put (destination, get (destination) + 1). После этого я просматриваю записи на карте и ищу ту, у которой наибольшее количество.

0 голосов
/ 20 марта 2016

В статистике это называется «режим» .Ванильное решение Java 8 выглядит следующим образом:

itinerary
      .stream()
      .flatMap(i -> StreamSupport.stream(
          Spliterators.spliteratorUnknownSize(i.iterator(), 0)
      ))
      .collect(Collectors.groupingBy(
          s -> s.getDestination().toLowerCase().replace(" ", ""), 
          Collectors.counting()
      ))
      .entrySet()
      .stream()
      .max(Comparator.comparing(Entry::getValue))
      .ifPresent(System.out::println);

jOOλ - это библиотека, которая поддерживает mode() в потоках.Следующая программа:

System.out.println(
    Seq.seq(itinerary)
       .flatMap(i -> Seq.seq(i.iterator()))
       .map(s -> s.getDestination().toLowerCase().replace(" ", ""))
       .mode()
);

(отказ от ответственности: я работаю в компании за jOOλ)

0 голосов
/ 19 февраля 2010

Попробуйте групповую функцию библиотеки lambdaj .Чтобы решить вашу проблему, вы можете сгруппировать объекты Itenarary в свойстве назначения, а затем найти группу с наибольшим размером, как в следующем примере:

Group<Sale> group = selectMax(group(itineraries, 
    by(on(Itenarary.class).getDestination())).subgroups(), on(Group.class).getSize());
0 голосов
/ 18 февраля 2010

Если вы не возражаете против использования внешнего jar-файла, вы можете легко использовать HashBag из Apache Commons.

public static String commonName(ArrayList<Itinerary> itinerary){

int count = 0;
int total = 0;
Bag names = new HashBag();

while(itr.hasNext()){ //while array of Itinerary object has next
    Itinerary temp = itr.next();  //temp = 1st itineray object
    if(temp.iterator().hasNext()){ //if its has destinations
            Destination temp2 = temp.iterator().next(); //n Destination object in itinerary object 
            String name = temp2.getDestination().toLowerCase().replace(" ", "");
            names.add(name, 1);
    }
}

А затем вы можете вызвать names.getCount ("destination1") дляполучить количество вхождений пункта назначения1

См. http://commons.apache.org/collections/userguide.html#Bags

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...