Замените множественную строку другой множественной строкой - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть строки вроде -

  1. да, у меня есть два, три, четыре числа
  2. У меня есть пять, шесть, семь алфавитов.
  3. восемь, два, пять - мои счастливые числа.

и у меня также есть карта

Map <String, String> wordToDigit = new HashMap<>;
Map.put("two", 2);
Map.put("three", 3);
Map.put("four", 4);
Map.put("five", 5);
Map.put("six", 6);
Map.put("eight",8);

Мне нужно заменить слова в строке на соответствующие значения на карте. Так как каждая строка не содержит все ключи, хранящиеся на карте. Итак, как я могу сделать это более эффективно, перебирая атрибут, который является частью строки, а не перебирая всю карту?

На выходе: -

1. yes, I have 2, 3, 4 numbers.
2. I have 5, 6, 7 alphabets.
3. 8, 2, 5 are my lucky numbers. 

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

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

Хитрость заключается в добавлении разделителей обратно, поскольку они не включены стандартным методом String.split.

Map <String, Integer> wordToDigit = new HashMap<>();
wordToDigit.put("two", 2);
wordToDigit.put("three", 3);
wordToDigit.put("four", 4);
wordToDigit.put("five", 5);
wordToDigit.put("six", 6);
wordToDigit.put("eight",8); 

String sentence = "yes, I have two, three, four numbers";

String[] words = sentence.split("[^a-zA-Z]+", -1);

int pos = 0;
StringBuilder sb = new StringBuilder();
for(String word : words)
{
    int idx = sentence.indexOf(word, pos);
    String delim = sentence.substring(pos, idx);
    sb.append(delim);        

    Integer n = wordToDigit.get(word.toLowerCase());
    sb.append(n == null ? word : n);

    pos += delim.length() + word.length();      
}
sb.append(sentence.substring(pos, sentence.length()));        

System.out.println(sb);

Вывод:

yes, I have 2, 3, 4 numbers

и для других 2 предложений

I have 5, 6, seven alphabets
8, 2, 5 are my lucky numbers.
1 голос
/ 07 апреля 2020

Ниже приведены две различные реализации: (1) Использование Map (2) Использование List и массива:

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

    public static void main(String[] args) throws IOException {
        // Test
        String[] sentences = { "yes, I have two, three, four numbers.", "I have five, six, seven alphabets.",
                "eight, two, five are my lucky numbers.", "Someone gave him FIVE canines and asked him to feed two." };
        System.out.println("Using Map: ");
        for (String sentence : sentences) {
            System.out.println(replaceWordsWithValue1(sentence));
        }
        System.out.println("Using List and array: ");
        for (String sentence : sentences) {
            System.out.println(replaceWordsWithValue2(sentence));
        }
    }

    static String replaceWordsWithValue1(String str) {
        Map<String, String> wordToDigit = Map.of("two", "2", "three", "3", "four", "4", "five", "5", "six", "6",
                "seven", "7", "eight", "8", "nine", "9");
        for (String key : wordToDigit.keySet()) {
            Pattern pattern = Pattern.compile("\\b" + Pattern.quote(key) + "\\b", Pattern.CASE_INSENSITIVE);
            Matcher matcher = pattern.matcher(str);
            while (matcher.find()) {
                str = str.replaceAll(matcher.group(), wordToDigit.get(key));
            }
        }
        return str;
    }

    static String replaceWordsWithValue2(String str) {
        String[] values = { "2", "3", "4", "5", "6", "7", "8", "9" };
        List<String> keys = List.of("two", "three", "four", "five", "six", "seven", "eight", "nine");
        for (String key : keys) {
            Pattern pattern = Pattern.compile("\\b" + Pattern.quote(key) + "\\b", Pattern.CASE_INSENSITIVE);
            Matcher matcher = pattern.matcher(str);
            while (matcher.find()) {
                str = str.replaceAll(matcher.group(), values[keys.indexOf(key)]);
            }
        }
        return str;
    }
}

Вывод:

Using Map: 
yes, I have 2, 3, 4 numbers.
I have 5, 6, 7 alphabets.
8, 2, 5 are my lucky numbers.
Someone gave him 5 canines and asked him to feed 2.
Using List and array: 
yes, I have 2, 3, 4 numbers.
I have 5, 6, 7 alphabets.
8, 2, 5 are my lucky numbers.
Someone gave him 5 canines and asked him to feed 2.

Лог c в обеих реализациях прост. Тем не менее, не стесняйтесь комментировать в случае каких-либо сомнений / проблем.

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