Как мне найти, насколько похожи два списка в Java? - PullRequest
0 голосов
/ 03 апреля 2012

Для домашнего задания мы должны превратить метод basicCompare во что-то, что позволит сравнить два текстовых документа и посмотреть, имеют ли они сходные темы. По сути, программа удалит все слова длиной менее пяти символов и оставляет нам списки. Мы должны сравнить списки и сделать так, чтобы при достаточном использовании слов в двух документах (скажем, сходство на 80%) метод возвращает true и сообщает «match».

Тем не менее, я застрял прямо о том, где все комментарии в нижней части метода. Я не могу придумать или найти способ сравнить два списка и выяснить, какой процент слов в обоих списках. Возможно, я думаю об этом неправильно, и мне нужно отфильтровать слова, которых нет в обоих списках, а затем просто посчитать, сколько слов осталось. Параметры для определения того, соответствуют ли входные документы полностью, оставлены на наше усмотрение, так что их можно установить так, как я хочу. Если вы, добрые дамы и господа, могли бы просто указать мне правильное направление, даже на страницу документа Java по определенной функции, я уверен, что смогу пройти остаток пути. Мне просто нужно знать, с чего начать.

import java.util.Collections;
import java.util.List;

public class MyComparator implements DocumentComparator {

        public static void main(String args[]){
                MyComparator mc = new MyComparator();

if(mc.basicCompare("C:\\Users\\Quinncuatro\\Desktop\\MatchLabJava\\LabCode\\match1.txt", "C:\\Users\\Quinncuatro\\Desktop\\MatchLabJava\\LabCode\\match2.txt")){
                    System.out.println("match1.txt and match2.txt are similar!");
            } else {
                    System.out.println("match1.txt and match2.txt are NOT similar!");
            }
    }

    //In the basicCompare method, since the bottom returns false, it results in the else statement in the calling above, saying they're not similar
    //Need to implement a thing that if so many of the words are shared, it returns as true

    public boolean basicCompare(String f1, String f2) {
            List<String> wordsFromFirstArticle = LabUtils.getWordsFromFile(f1);
            List<String> wordsFromSecondArticle = LabUtils.getWordsFromFile(f2);

            Collections.sort(wordsFromFirstArticle);
            Collections.sort(wordsFromSecondArticle);//sort list alphabetically

            for(String word : wordsFromFirstArticle){
                    System.out.println(word);
            }

            for(String word2 : wordsFromSecondArticle){
                    System.out.println(word2);
            }

            //Find a way to use common_words to strip out the "noise" in the two lists, so you're ONLY left with unique words
            //Get rid of words not in both lists, if above a certain number, return true
            //If word1 = word2 more than 80%, return true

            //Then just write more whatever.basicCompare modules to compare 2 to 3, 1 to 3, 1 to no, 2 to no, and 3 to no

            //Once you get it working, you don't need to print the words, just say whether or not they "match"

            return false;

    }


    public boolean mapCompare(String f1, String f2) {

            return false;
    }

}

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

Попробуйте придумать алгоритм, выполнив шаги на бумаге или в своей голове. Как только вы поймете, что вам нужно сделать, переведите это в код. Так изобретены все алгоритмы.

0 голосов
/ 03 апреля 2012

Начните с изменения списка в Set для удаления дубликатов.

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

int count = 0;
Set<String> set1 = new HashSet<String>(LabUtils.getWordsFromFile(f1));
Set<String> set2 = new HashSet<String>(LabUtils.getWordsFromFile(f2));

Iterator<String> it = set1.iterator();

while (it.hasNext()){
    String s = it.next();

    if (set2.contains(s)){
        count++;
    }

}

Затем используйте счетчик для расчета процента (количество / общее число) * 100. Если это больше 80%, тогда верните true, иначе верните false.

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

...