我是stackoverflow的新手,这是我在stackoverflow上的第一个问题。
我脑子里有一个问题:
以这样的方式打印Output1和Output2的值:Output1应该打印String1中但不在String2中的所有字符,而Output2应该打印String2中但不在String1中的所有字符。
实施例: 如果String1:ABC和String:BC则输出1:A和输出2:
如果String1:BC和String:BANGALORE则输出1:C和输出2:ANGALORE
我知道此问题类似于Remove characters from the second string which are present in the first string和Given two strings, str1 and str2 as input, remove all chars from str1 that appear in str2 但在这里我想将String1和String2的结果作为两个不同的字符串Output1和Output2
我已经尝试过以下程序来实现这一点,但不确定这是否是一个很好的解决方案,因为我需要四个for循环来获得结果。
package com.test.java.program;
import java.util.Scanner;
public class PrintString {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Enter first input as a string: ");
String str1 = scanner.nextLine();
System.out.println("Enter first input as a string: ");
String str2 = scanner.nextLine();
System.out.println(printStringOutput(str1, str2));
}
private static String printStringOutput(String str1, String str2){
String strTemp1 = str1;
int strLen1 = str1.length();
int strLen2 = str2.length();
for(int i=0; i<strLen1; i++){
for(int j=0; j<strLen2; j++){
if(str1.charAt(i) == (str2.charAt(j))){
str1 = str1.replace(str1.charAt(i), '\u0000');
}
}
}
for(int i=0; i<strLen2; i++){
for(int j=0; j<strLen1; j++){
if(str2.charAt(i) == (strTemp1.charAt(j))){
str2 = str2.replace(str2.charAt(i), '\u0000');
}
}
}
return "Output1: " + str1 + "\nOutput2: " + str2;
}
}
我知道我们也可以使用正则表达式获得相同的结果,但不知道如何做到这一点。有人可以为这个问题提供更好的解决方案。
我假设给定的输入是字符串,而不是对输入执行任何验证。
感谢。
答案 0 :(得分:1)
另外两个答案(到目前为止)产生1个字符的字符串作为中间对象,效率不高。
在Dmitry Gorkovets's answer的基础上,这是一个更好的版本:
String result1 = str1.chars()
.filter(ch -> str2.indexOf(ch) < 0)
.collect(StringBuilder::new,
(buf, ch) -> buf.append((char) ch),
StringBuilder::append)
.toString();
<强>更新强>
作为mentioned by Jakub M.,如果str2
可以是一个长字符串,则可以通过将字符串转换为Map
个字符来获得更好的性能,如下所示:
Set<Integer> set = str2.chars()
.boxed()
.collect(Collectors.toSet());
String result1 = str1.chars()
.filter(ch -> ! set.contains(ch))
.collect(StringBuilder::new,
(buf, ch) -> buf.append((char) ch),
StringBuilder::append)
.toString();
答案 1 :(得分:0)
我在代码中没有看到任何问题,它有效。但是,如果您想使用Java 8功能,可以使用以下代码:
String str1 = "BC";
String str2 = "BANGALORE";
String result1 = str1.chars()
.mapToObj(i -> (char)i)
.filter(c -> str2.indexOf(c) < 0)
.map(String::valueOf)
.collect(Collectors.joining());
String result2 = str2.chars()
.mapToObj(i -> (char)i)
.filter(c -> str1.indexOf(c) < 0)
.map(String::valueOf)
.collect(Collectors.joining());
System.out.println(result1);
System.out.println(result2);
答案 2 :(得分:0)
使用流你可以这样做:
Stream.of(str1.split(""))
.filter((a)->!str2.contains(a))
.forEach(System.out::print);
Stream.of(str2.split(""))
.filter((a)->!str1.contains(a))
.forEach(System.out::print);