Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2017, 10:20   #1
EDWIN503
Пользователь
 
Регистрация: 13.11.2016
Сообщений: 15
По умолчанию Даны два слова. Напечатать только те буквы слов, которые встречаются в обоих словах только один раз.

Добрый день, нужна помощь с заданием: Даны два слова. Напечатать только те буквы слов, которые встречаются в обоих словах только один раз.
Пока что у меня есть только это:
Код:
import java.util.Scanner;
 
public class Lab2 {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
 
        System.out.println("Введите первое слово:");
        String[] word = new String[2]; //создаем массив из двух элементов
        word[0] = in.nextLine(); //и получаем слова
        System.out.println("Введите второе слово:");
        word[1] = in.nextLine();
 
        for(int i = 0; i < word[0].length() & i < word[1].length(); i++){ //цикл до тех пор пока i меньше длинны обоих слов
            if(word[0].charAt(i) == word[1].charAt(i)){
                System.out.print(word[0].charAt(i)); //выводим какая буква совпадает
            }
        }
    }
}
Работает не всегда верно, например если слова будут разной длинны. Да и нет проверки на то, чтобы буква встречалась только один раз. Буду раз любой помощи
EDWIN503 вне форума Ответить с цитированием
Старый 24.09.2017, 03:54   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Вам нужно использовать букву, как ключ, а значением будет счетчик. Вариантов понимания вашей задачи несколько:
1. В суммарной строке, составленой из всех слов, буква 1 раз.
2. В каждом из слов буква 1 раз, но суммарно может быть и 2.

...в принципе читайте Map<Char,Integer> и/или Set<Char> - смотря, как вы понимаете задачу.
alexzk вне форума Ответить с цитированием
Старый 24.09.2017, 17:16   #3
EDWIN503
Пользователь
 
Регистрация: 13.11.2016
Сообщений: 15
По умолчанию

В принципе, с заданием я почти справился (как мне кажется)
Код:
import java.util.Map;
import java.util.Scanner;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Lab2 {	
	
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
 
        System.out.println("Введите первое слово:");
        String[] word = new String[2]; //создаем массив из двух элементов
        word[0] = in.next(); //и получаем слова
        System.out.println("Введите второе слово:");
        word[1] = in.next();
        in.close();

        String conc = word[0].concat(word[1]);
        String result = conc.toLowerCase();
        System.out.println(result);
        Map<Integer, Long> frequencies = result.codePoints()
            .boxed()
            .collect(Collectors.groupingBy(
            Function.identity(), Collectors.counting()));

		String duplicates = frequencies.entrySet()
			.stream()
			.filter(e -> e.getValue() != 2)
			.map(Map.Entry::getKey)
			.map(Character::toChars)
			.map(String::valueOf)
			.filter(i -> !i.equals(" "))
			.collect(Collectors.joining());
		
		System.out.println(result.replaceAll("(?i)[" + duplicates + "]", ""));
    }
}
Но есть одно "Но", Если в одном из слов будет повторяться буква один раз а в другом нет, то программа все равно выведет эту букву.
Например:
1 Слово - lol
2 Слово - qwer
То выведутся буквы ll так как они есть в первом слове.
Прошу, подскажите, как мне исправить это
EDWIN503 вне форума Ответить с цитированием
Старый 25.09.2017, 03:37   #4
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Сделать ...в вашем случае 2, но вообще "карту-карт", типа

Map<String, Map<Char, Integer>>

Первый ключ - это слово, в слове считаем символы. Ну и программа усложняется циклом по словам (массив слов у вас есть, так что ввод переделать еще в 1 цикл).
Можно сделать "массив карт"

Map<Char, Integer>[] и следить, чтобы индекс в нем, совпадал с индексом в массиве слов. Такое решение более экономно по ресурсам, но вероятнее допустить ошибки программиста в далеком будующем.

Вобщем идея - считать РАЗДЕЛЬНО ДЛЯ КАЖДОГО слова. А дальше уже выбирать как угодно - хоть в каждом по 1, хоть суммарно менее 2 и т.д.
alexzk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оставить в списке числа, которые встречаются только один раз - C++ Родион_Волков Помощь студентам 6 04.12.2016 14:08
Вывести только те слова сообщения, которые встречаются в нем ровно один раз С++ filimoncc Помощь студентам 11 23.02.2014 19:30
Найти слова, которые встречаются в тексте только 1 раз akademochka Помощь студентам 1 05.10.2012 12:40
Вывод на экран символов, которые встречаются только один раз. Tsunami C++ Builder 1 10.04.2011 19:00
[C++ Builder 6] Вывод на экран символов, которые встречаются только один раз. Tsunami Помощь студентам 0 07.04.2011 09:21