Метод .contains работает не так как надо

У меня есть задание: Считать две строки из файла. Построить новую строку, состоящую из символов, которые входят как в одну, так и в другую строку. И есть код:`

public static void main(String[] args) throws FileNotFoundException {
    Scanner in = new Scanner(System.in);
    String a = "C:\\qq.txt";
    try (BufferedReader     r = new BufferedReader(new FileReader(a));
            BufferedWriter out = new BufferedWriter(new FileWriter(new File(a), true))) {
        String result = "";
        String line;
        while ((line = r.readLine()) != null) {
            for (String letter : line.split("")) {
                if (!result.contains(letter) /*&& Character.isAlphabetic(letter.charAt(0))*/) {
                    result += letter;
                }
                
            }
        }
        out.newLine();
        out.write(result);
    } catch (IOException ioe) {
        System.out.println("Error" + ioe);
    }
}

Метод .containsn работает, но не правильно - не со всеми строками. Примеры строк и вывода находятся во вложениях. Что я делаю не так?

1 2


Ответы (1 шт):

Автор решения: Alex Rudenko

Очевидно, надо сперва прочитать обе строки, а не обрабатывать каждую по отдельности.
Также для определения того, содержится ли символ в строке, не обязательно разбивать строку на подстроки длиной 1 символ и использовать String::contains, для проверки наличия символов лучше использовать String::indexOf:

public static String commonResult(String s1, String s2) {
    StringBuilder sb = new StringBuilder();
    
    for (char c : s1.toCharArray()) {
        if (s2.indexOf(c) != -1) {
            sb.append(c);
        }
    }
    return sb.toString();
}

Тест - буквы k, d отфильтрованы

System.out.println(commonResult("kemper", "demper"));
// -> emper
→ Ссылка