Есть несколько способов.Первый (который я бы предложил использовать регулярное выражение):
String input = "abcfra";
Pattern p = Pattern.compile("(\\w)(?=.*\\1)");
Matcher m = p.matcher("input");
if (m.find()) {
System.out.println(m.group());
}
Второй - это Stream-way из двух циклов:
int index = IntStream.range(0, input.length())
.filter(x -> IntStream.range(x, input.length())
.filter(y -> input.indexOf(x) == input.indexOf(y))
.findAny()
.isPresent()
)
.findFirst()
.getAsInt();
System.out.println(input.charAt(index));
И третий,что вам, очевидно, не нравится:
char result = input.chars()
.collect(
() -> new LinkedHashMap<Character, Integer>(),
(map, x) -> map.merge((char) x, 1, (oldV, newV) -> oldV + newV),
(left, right) -> {
for (Entry<Character, Integer> e : right.entrySet()) {
left.merge(e.getKey(), e.getValue(), (oldV, newV) -> oldV + newV);
}
}
)
.entrySet()
.stream()
.filter(x -> x.getValue() > 1)
.map(Entry::getKey)
.findFirst()
.orElse('?');
Что в основном близко к тому же, что и вы.Просто обратите внимание, что вы пытаетесь решить проблему, которую, вероятно, не нужно решать с самого начала (производительность, проходящая через все входные данные и собирающая до Map
).