Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Ассоциативный массив


Автор: PSImozg 18.1.2014, 11:36
Задание: Есть текст, нужно найти слова которые повторяются и сколько раз. Реализовать нужно массивом Map.

Код

         private static void perebor2(){ 
         String n[] = a.replaceAll("[^a-zA-Z ]", "").split(" ");//Оставляем только слова
          Set <String> set = new HashSet <String> (Arrays.asList(n));/*записываем массив1 в ХЭШ, чтобы
         убрать дубликаты(считал количество индивидуальных слов)*/
        String[] r = set.toArray(new String[set.size()]); 
        Map<String, Text> map = new Hashtable<String, Text>();
         
        for (int i=0; i<n.length; i++){
      
          boolean ob1=map.containsKey(n[i]);//Проверяю наличие слова в массиве
          if (ob1==false)//Если нет добавляю слово и счетчик 1 по ключу=слову
          {Text st = new Text(1, n[i]);
          map.put(n[i], st);
          //ch=st.getnumber();
                            }
          else//Если есть то должен просто увеличить счетчик на +1
          { Integer get = map.getnumber(n[i]);/*Вот тут у меня ошибка, как взять только цифру по ключу из массива?*/
           get++;
                Text st1 = new Text(get, n[i]);
                      map.put(n[i], st1);
          }
          System.out.println(map.get(n[i]));//работает
          }
        }


В целом программа работает, не могу реализовать только правильное увеличение счетчика, потому что не могу вытащить значение number по ключу. Получается так сделать, если сделать массив map одномерным и реализовать следующий код.
Код

           Integer get = map.get(n[i]);
           get++;
           map.put(n[i], get);

Но тогда у меня проблема с выводом в виде: слово-счетчик.

И еще один вопрос. Можно ли как то отсортировать map если в нем только 1 значение int, если можно то как?
Arrays.sort(???);
Помогите пожалуйста. Заранее спасибо.

Автор: PSImozg 18.1.2014, 13:57
В общем реализовал вот так.
Код

private static void perebor2(){ 
         String n[] = a.replaceAll("[^a-zA-Z ]", "").split(" ");
          Set <String> set = new HashSet <String> (Arrays.asList(n));
        String[] r = set.toArray(new String[set.size()]); 
        Map<String, Integer> map = new Hashtable<String, Integer>();   
       
 for (int i=0; i<n.length; i++){
    
          boolean ob1=map.containsKey(n[i]);
          if (ob1==false)
          {
          map.put(n[i], 1);
                            }
          else
          { Integer get = map.get(n[i]);
           get++;
                      map.put(n[i], get);

          }}
     Set <String> key=map.keySet();
        Iterator <String> it=key.iterator();
        for ( String el : key){
            Arrays.sort();//Вот тут проблема, не пойму, что написать, что бы отсортировал по количеству повторов?!
         System.out.println( it.next()+" = "+map.get(el));
        }}


Помогите сделать сортировку пожалуйста.

Автор: Samotnik 18.1.2014, 16:30
PSImozg,  smile 
Цитата(PSImozg @  18.1.2014,  11:36 Найти цитируемый пост)
Есть текст, нужно найти слова которые повторяются и сколько раз. Реализовать нужно массивом Map.

Код

import java.util.HashMap;
import java.util.Map;

public class New {
    private static final String text = "mama mila ramu a rama mila papu";

    public static void main(String... args) {
        String[] arr = text.split(" ");
        Map<String, Integer> wordsMAp = new HashMap<>();
        for (String str : arr) {
            if (wordsMAp.containsKey(str)) {
                Integer amount = wordsMAp.get(str);
                wordsMAp.put(str, ++amount);
            } else {
                wordsMAp.put(str, 1);
            }
        }
        //print it
        for (Map.Entry<String, Integer> entry : wordsMAp.entrySet()) {
            System.out.println("The word: " + entry.getKey() + " was occurred " + entry.getValue() + " times");
        }
    }

}


Автор: PSImozg 19.1.2014, 09:20
Благодарю за помощь. А не подскажите как еще отсортировать его, что бы например вывести 3 самых часто повторяющихся слова?

Автор: Pawl 19.1.2014, 09:51
Цитата(PSImozg @  19.1.2014,  09:20 Найти цитируемый пост)
 А не подскажите как еще отсортировать его, что бы например вывести 3 самых часто повторяющихся слова?

Сортировка по убыванию значений карты:
Код

import java.util.*;

public class SortMapValues {
    private static final String text = "mama mila rama a rama mila papu mila a a a";

    public static void main(String... args) {
        String[] arr = text.split(" ");
        Map<String, Integer> wordsMAp = new HashMap<>();
        for (String str : arr) {
            if (wordsMAp.containsKey(str)) {
                Integer amount = wordsMAp.get(str);
                wordsMAp.put(str, ++amount);
            } else {
                wordsMAp.put(str, 1);
            }
        }
        ValueComparator bvc = new ValueComparator(wordsMAp);
        TreeMap<String, Integer> sorted_map = new TreeMap<String, Integer>(bvc);
        sorted_map.putAll(wordsMAp);                               
        for (Map.Entry<String, Integer> entry : sorted_map.entrySet()) {
            System.out.println("The word: " + entry.getKey() + " was occurred " + entry.getValue() + " times");
        }
    }
}

class ValueComparator implements Comparator<String> {
    Map<String, Integer> base;
    
    public ValueComparator(Map<String, Integer> base) {
        this.base = base;
    }

    // Note: this comparator imposes orderings that are inconsistent with equals.    
    public int compare(String a, String b) {
        if (base.get(a) >= base.get(b)) {
            return -1;
        } else {
            return 1;
        } // returning 0 would merge keys
    }
}

Вывод:
Код

The word: a was occurred 4 times
The word: mila was occurred 3 times
The word: rama was occurred 2 times
The word: papu was occurred 1 times
The word: mama was occurred 1 times

Автор: PSImozg 19.1.2014, 10:25
Огромное всем спасибо за помощь, вы очень сильно мне помогли. Буду теперь сидеть разбираться как оно работает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)