Группировка элементов вложенного цикла на основе первой итерационной переменной в Java - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть 2 списка один для предложения один для ключевых слов.Идея состоит в том, чтобы проверить, есть ли в предложении ключевые слова.и поместите их в список для каждого предложения по порядку.

Извините, если это уже было продублировано здесь заранее.

List <String> sentence= new ArrayList <>();
sentence.add("this is a good dog");
sentence.add("cats drink milk");
sentence.add("Animals are beautiful creatures");

List <String> keyword= new ArrayList <>();
keyword.add("dog");
keyword.add("cats");
keyword.add("beautiful");
keyword.add("good");
keyword.add("are");
keyword.add("this");
keyword.add("milk");

Моя идея состояла в том, чтобы создать 2 вложенных цикла для каждого списка:

for (int b = 0; b < sentence.size(); b++) {
    for (int c = 0; c < keyword.size(); c++) {
        if (sentence.get(b).contains(keyword.get(c))) {
            System.out.println(keyword.get(c));
        }
    }
}

Вывод этого:

dog
good
this
cats
milk
beautiful
are

Желаемый вывод будет:

[this,good,dog]
[cats,milk]
[are,beautiful]

Так что это похоже на получение всех существующих ключевых слов,в порядке предложения, не относящегося к порядку ключевых слов.

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

Надеюсь, это понятно.Буду очень признателен за любые идеи.не должен следовать тому же методу.

Ответы [ 6 ]

0 голосов
/ 21 февраля 2019

Вам нужно небольшое изменение в цикле

for (int i = 0; i < sentence.size(); i++) {
    String[] matchArray = new String[sentence.get(i).split(" ").length];
    for (int j = 0; j < keyword.size(); j++) {
        if (sentence.get(i).contains(keyword.get(j))) {
            matchArray[Arrays.asList(sentence.get(i).split(" ")).indexOf(keyword.get(j))] = keyword.get(j);
        }
    }
    List<String> matchList = new ArrayList<String>();
    for(String match: matchArray) {
        if(match != null) {
            matchList.add(match);
        }
    }
    System.out.println(matchList);
}

Для каждого предложения создайте array с размером, совпадающим с предложением (только для обеспечения размера).Теперь, когда совпадения найдены, получите индекс совпадения из предложения и добавьте элемент к этому конкретному индексу array.Таким образом, в конце итерации ключевого слова у вас будут все совпадения в массиве со значениями null, если некоторые слова не совпадают.

Теперь объявляем новую List строку, в которую добавляются элементы из массива, которые являютсяненулевой.Наконец распечатайте список.

0 голосов
/ 21 февраля 2019

Переберите ваш список sentence.Для каждого предложения повторяйте список keyword.Добавьте каждое найденное ключевое слово, найденное в tempList, отсортируйте tempList по индексу ключевого слова в предложении и, наконец, добавьте каждый tempList в список списков.Пример:

public static void main(String[] args) {
    List <String> sentence= new ArrayList <>();
    sentence.add("this is a good dog");
    sentence.add("cats drink milk");
    sentence.add("Animals are beautiful creatures");

    List <String> keyword= new ArrayList <>();
    keyword.add("dog");
    keyword.add("cats");
    keyword.add("beautiful");
    keyword.add("good");
    keyword.add("are");
    keyword.add("this");
    keyword.add("milk");

    List<List<String>> result = new LinkedList<>();
    for(String sen: sentence){
        List<String> tempList = new ArrayList<>();
        for(String key: keyword){            
            if(sen.contains(key)){
                tempList.add(key);
            }
        }
        tempList.sort(new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                   return sen.indexOf(o1) -  sen.indexOf(o2) ;
                }
        });
        result.add(tempList);
    }
    for(List<String> r : result){
        System.out.println(r);
    }
}
0 голосов
/ 21 февраля 2019

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

Map <String, ArrayList<String>> sentences= new HashMap<>();
sentences.put("this is a good dog", new ArrayList<>());
sentences.put("cats drink milk", new ArrayList<>());
sentences.put("Animals are beautiful creatures", new ArrayList<>());

List <String> keyword= new ArrayList <>();
keyword.add("dog");
keyword.add("cats");
keyword.add("beautiful");
keyword.add("good");
keyword.add("are");
keyword.add("this");
keyword.add("milk");

keyword.forEach(word -> sentences.entrySet().stream()
        .filter(map -> map.getKey().contains(word)).
        forEach(map -> sentences.computeIfAbsent(map.getKey(), key->new ArrayList<>()).add(word)));

sentences.forEach((key, value) -> System.out.println(value));
0 голосов
/ 21 февраля 2019

Я бы использовал следующее:

for(String currentSentence : sentence) {
    List<String> keywordsInSentence = new ArrayList<>();
    for (String word : currentSentence.split("\\s+")) {
        if (keyword.contains(word)) {
            keywordsInSentence.add(word);
        }
    }
    System.out.println(keywordsInSentence);
}

Вы можете попробовать здесь .

(и я бы переименовал sentence в sentences илиsentenceList и аналогично для keyword, иначе это просто сбивает с толку)

Если вам нужно сделать что-то большее с ключевыми словами, чем их немедленное отображение, вы можете вставить списки keywordsInSentence в Map<String, List<String>>, который выбудет иметь значение, заменив System.out.println на map.put(currentSentence, keywordsInSentence).

0 голосов
/ 21 февраля 2019

Попробуйте что-то вроде этого:

    for (String sen: sentence) {
        System.out.print("[");
        boolean first = true;
        for (String word: sen.split("[\\s\\p{Punct}]")) {
            if (keyword.contains(word)) {
                if (first) {
                    first = false;
                } else {
                    System.out.print(",");
                }
                System.out.print(word);
            }
        }
        System.out.println("]");
    }
0 голосов
/ 21 февраля 2019

это следует сделать, печатая точно в том формате, который вы запрашивали:

for (int b = 0; b < sentence.size(); b++) {
     String arr[] = sentence.get(b).split("\\s+");
     List result = new ArrayList<>();
     for (int c = 0; c < arr.length; c++ ) {             
         if (keyword.contains(arr[c])) 
             result.add(arr[c]);        
     }
     System.out.println(result);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...