从String1中删除String2中存在的所有字符,反之亦然



我是stackoverflow的新手,这是我对stackoverflow提出的第一个问题。

我脑子里有一个问题:

以这样的方式打印Output1和Output2的值,即Output1应打印String1中存在的所有字符,而不是String2中存在的字符,Output2应打印String2中出现的所有字符。

示例:如果String1:ABC和String:BC,则Output1:A和Output2:

如果String1:BC和String:BANGALORE,则Output1:C和Output2:ANGALORE

我知道这个问题看起来类似于从第一个字符串中出现的第二个字符串中删除字符,并给定两个字符串str1和str2作为输入,从str1中删除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;
}
}

我知道使用regex表达式也可以获得相同的结果,但不确定如何做到。有人能为这个问题提供更好的解决方案吗。

我假设给定的输入是字符串,并且不对输入执行任何验证。

谢谢。

其他两个答案(到目前为止)生成1个字符的字符串作为中间对象,这不是很有效。

在Dmitry Gorkovets的回答的基础上,这里有一个更好的版本:

String result1 = str1.chars()
.filter(ch -> str2.indexOf(ch) < 0)
.collect(StringBuilder::new,
(buf, ch) -> buf.append((char) ch),
StringBuilder::append)
.toString();

更新

正如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();

我认为您的代码中没有任何问题,它是有效的。但如果你想使用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);

使用流可以这样做:

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);

相关内容

最新更新