Карта карты - пары слов в Java - застрял - PullRequest
0 голосов
/ 15 января 2010

Я использую приглашение Windows MSDOS для передачи в файл ... это обычный файл со словами. (Не как abc, def, ghi..etc)

Я пытаюсь написать программу, которая подсчитывает, сколько раз каждая пара слов появляется в текстовом файле. Пара слов состоит из двух последовательных слов (то есть слова и слова, которое непосредственно следует за ним). В первом предложении этого абзаца слова «считает» и «как» представляют собой пару слов.

То, что я хочу, чтобы программа сделала, это введите:

abc def abc ghi abc def ghi jkl abc xyz abc abc abc ---

Должен выдать этот вывод:

abc:
abc, 2
def, 2
ghi, 1
xyz, 1

def:
abc, 1
ghi, 1

ghi:
abc, 1
kl, 1

jkl:
abc, 1

xyz:
abc, 1

Хотя мой вклад не будет таким. Мой вклад будет больше похож на: "Ожидается, что Сиэтл Амазонком отчитается" так что мне даже нужно проверить на "abc"?

МОЯ БОЛЬШАЯ проблема - добавить ее на карту ... так что я думаю

Я думаю, мне нужно использовать карту карты? Я не уверен, как это сделать?

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

Я думаю, что карта выдаст мне этот вывод: это именно то, что я хочу ..

Key    |    Value           number of times
--------------------------
abc    |    def, ghi, jkl    3  
def    |    jkl, mno         2

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

if(words.contain("abc"))        // would i even need to test for abc?????

{
 uniqueWords.put("abc", words, ?)  // not sure what to do about this?
}

это то, что у меня есть.

import java.util.Scanner;
import java.util.ArrayList;
import java.util.TreeSet;
import java.util.Iterator;
import java.util.HashSet;

public class Project1
{
public static void main(String[] args)
{
    Scanner sc = new Scanner(System.in); 
    String word;
    String grab;
    int number;

    // ArrayList<String> a = new ArrayList<String>();
    // TreeSet<String> words = new TreeSet<String>();
     Map<String, Map<String, Integer>> uniquWords = new HashMap<String, Map<String, Integer>>();

    System.out.println("project 1\n");

    while (sc.hasNext()) 
    {
        word = sc.next();
        word = word.toLowerCase();

        if (word.matches("abc"))      // would i even need to test for abc?????
        {
            uniqueWords.put("abc", word);  // syntax incorrect i still need an int!
        }

        if (word.equals("---"))
        {
            break;
        }
    }

    System.out.println("size");
    System.out.println(uniqueWords.size());

    System.out.println("unique words");
    System.out.println(uniqueWords.size());

    System.out.println("\nbye...");
}
}

Я надеюсь, что кто-то может мне помочь, потому что я бьюсь головой и уже несколько недель не учу ничего .. Спасибо ...

Ответы [ 5 ]

1 голос
/ 20 января 2011

Чтобы сделать ваш ответ в алфавитном порядке ... Просто сделайте все HashMap в TreeMap. Например:

new HashMap> (); ' в новый TreeMap> ();

и не забудьте добавить импорт java.util.TreeMap;

1 голос
/ 15 января 2010

Я придумал это решение.Я думаю, что ваша идея с Картой может быть более элегантной, но запустите ее, и давайте посмотрим, сможем ли мы улучшить:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class Main {

   private static List<String> inputWords = new ArrayList<String>();
   private static Map<String, List<String>> result = new HashMap<String, List<String>>();

    public static void main(String[] args) {

        collectInput();
        process();
        generateOutput();
    }

     /*
     * Modify this method to collect the input
     * however you require it
     */
    private static void collectInput(){
        // test code
        inputWords.add("abc");
        inputWords.add("def");
        inputWords.add("abc");
        inputWords.add("ghi");
        inputWords.add("abc");
        inputWords.add("def");
        inputWords.add("abc");
    }

    private static void process(){

        // Iterate through every word in our input list
        for(int i = 0; i < inputWords.size() - 1; i++){

            // Create references to this word and next word:
            String thisWord = inputWords.get(i);
            String nextWord = inputWords.get(i+1);

            // If this word is not in the result Map yet,
            // then add it and create a new empy list for it.
            if(!result.containsKey(thisWord)){
                result.put(thisWord, new ArrayList<String>());
            }

            // Add nextWord to the list of adjacent words to thisWord:
            result.get(thisWord).add(nextWord);
        }
   }

     /*
     * Rework this method to output results as you need them:
     */
    private static void generateOutput(){
        for(Entry e : result.entrySet()){
            System.out.println("Symbol: " + e.getKey());

            // Count the number of unique instances in the list:
            Map<String, Integer>count = new HashMap<String, Integer>();
            List<String>words = (List)e.getValue();
            for(String s : words){
                if(!count.containsKey(s)){
                    count.put(s, 1);
                }
                else{
                    count.put(s, count.get(s) + 1);
                }
            }

            // Print the occurances of following symbols:
            for(Entry f : count.entrySet()){
                System.out.println("\t following symbol: " + f.getKey() + " : " + f.getValue());
            }
        }
        System.out.println();
    }
}
1 голос
/ 15 января 2010

Вы инициализировали uniqueWords как Карту Карт, а не Карту Строк, поскольку вы пытаетесь ее заполнить. Чтобы ваш дизайн работал, вам нужно ввести Map<String, Integer> в качестве значения для клавиши "abc".

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

System.out.println("project 1\n");

while (sc.hasNext()) 
{
    word = sc.next();
    word = word.toLowerCase();

    if (word.matches("abc"))      // would i even need to test for abc?????  
                                  // no, just use the word 
    {
        uniqueWords.put("abc", word);  // <-- here you are putting a String value, instead of a Map<String, Integer>
    }

    if (word.equals("---"))
    {
        break;
    }
}

Вместо этого вы могли бы сделать что-то похожее на следующий метод грубой силы:

    Map<String, Integer> followingWordsAndCnts = uniqueWords.get(word);
    if (followingWordsAndCnts == null) {
        followingWordsAndCnts = new HashMap<String,Integer>();
        uniqueWords.put(word, followingWordsAndCnts); 
    }
    if (sc.hasNext()) {
        word = sc.next().toLowerCase();
        Integer cnt = followingWordsAndCnts.get(word);
        followingWordsAndCnts.put(word, cnt == null? 1 : cnt + 1);
    }  

Вы можете сделать это рекурсивным методом, чтобы гарантировать, что каждое слово получает свой ход как следующее слово и слово, за которым следует

1 голос
/ 15 января 2010

для каждого ключа (например, «abc»), в котором вы хотите сохранить другую строку (например, «def», «abc») в сочетании с целым числом (1,2)

Я бы скачал коллекции Google и использовал бы карту >

Map<String, Multiset<String>> myMap = new HashMap<String, Multiset<String>>();
...

void addPair(String word1, String word2) {
    Multiset<String> set = myMap.get(word1);
    if(set==null) {
        set = HashMultiMap.create();
        myMap.put(word1,set);
    }
    set.add(word2);
}

int getOccurs(String word1, String word2) {
    if(myMap.containsKey(word1))
    return myMap.get(word1).count(word2);
    return 0;
}

Если вы не хотите использовать Multiset, вы можете создать логические эквиваленты (для ваших целей, а не для общего назначения):

Мультисеть === Карта
Карта > === Карта >

1 голос
/ 15 января 2010

В вашей таблице есть ключ | Значение | Количество раз. Является ли «число времен» специфичным для каждого второго слова? Это может сработать.

Мое предложение в вашем последнем вопросе было использовать карту списков. Каждое уникальное слово будет иметь связанный список (пустой для начала). В конце обработки вы подсчитываете все идентичные слова в списке, чтобы получить в итоге:

Key   |  List of following words
abc   |   def def ghi mno ghi

Теперь вы можете сосчитать идентичные предметы в вашем списке и выяснить, что: abc -> def = 2 abc -> ghi = 2 abc -> mno = 1

Я думаю, что этот подход или ваш будет работать хорошо. Я соберу код и обновлю этот пост, никто больше не отвечает.

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