【问题标题】:Removing duplicate character in string using StringBuilder使用 StringBuilder 删除字符串中的重复字符
【发布时间】:2016-05-30 16:59:10
【问题描述】:

我正在尝试比较 2 个字符串并使用 StringBuilder 删除重复项..但是当我运行此代码时..它会删除找到的第一个重复项,然后退出循环...不删除第二个..

String name1 = "alpha";
String name2 = "delta";

name1 = name1.toLowerCase();
name2 = name2.toLowerCase();

StringBuilder sb1 = new StringBuilder(name1);
StringBuilder sb2 = new StringBuilder(name2);

for(int i=0; i<sb1.length();i++)
{
    for(int j=0; j<sb2.length(); j++)
    {
        if(sb1.charAt(i) == sb2.charAt(j))
        {
            name1 = sb1.deleteCharAt(i).toString();
            name2 = sb2.deleteCharAt(j).toString();
        }
    }
}
System.out.println(name1);
System.out.println(name2);

输出:

lpha
delt

【问题讨论】:

  • 预期输出是什么?
  • @JavaGeo 重复要从两个字符串中删除... ExpectedOutput: name1 = pha and name2 = det .... 从两个字符串中删除第一个重复的 'a' 后......它出来了循环..
  • 您将删除每个字符的结果存储在name1 中,但您每次都在循环中覆盖它...
  • 为澄清起见,如果delta 字符串中有另一个“a”,这会去掉alpha 中的第二个“a”吗?即您是否要删除匹配对?
  • @JavaGeo 他说预期是 name1 的 pha 和 name2 的 det。由于我暗示的原因......现在在下面解释,alpha 中的“l”被跳过了。

标签: java string stringbuilder string-comparison


【解决方案1】:

您的代码不起作用,因为每次从StringBuilder 中删除一个字符时,StringBuilder 的长度都会减少。并且所有字符的索引也发生了变化。

因此,不要直接在循环中删除字符,而是将要删除的字符替换为其他符号(此处为 0),然后将其删除,或者不打印 0

试试下面的代码:

String name1 = "alpha";
String name2 = "delta";

name1 = name1.toLowerCase();
name2 = name2.toLowerCase();


StringBuilder sb1 = new StringBuilder(name1);
StringBuilder sb2 = new StringBuilder(name2);

for(int i=0; i<sb1.length();i++)
{
for(int j=0; j<sb2.length(); j++)
{

    if(sb1.charAt(i) == sb2.charAt(j))
    {
        sb1.replace(i, i+1, "0");
        sb2.replace(j,j+1,"0");
    }
}
}

String s = sb1.toString();
String t = sb2.toString();
for(int i=0;i<s.length();i++){
    if(s.charAt(i)!='0'){
    System.out.print(s.charAt(i));
    }
}
    System.out.println();
for(int i=0;i<s.length();i++){
    if(t.charAt(i)!='0'){
    System.out.print(t.charAt(i));
    }
} 

也不需要在for 循环中每次都将StringBuilder 转换为String

【讨论】:

  • 替换是可以的,只要你知道(在合理范围内)原始字符串中不会有替换字符的实例。如果您选择这样做,请务必选择合适的角色,否则事情可能会开始变得有点不稳定。只是一个似乎值得一提的小警告。
【解决方案2】:

试试下面的代码。 例如 字符串名称1 =“阿尔法”; 字符串名称2 = "delta";

输出将是

“ph” “检测”

String name1 = "alpha";
String name2 = "delta";

name1 = name1.toLowerCase();
name2 = name2.toLowerCase();

StringBuilder sb1 = new StringBuilder(name1);
StringBuilder sb2 = new StringBuilder(name2);

ArrayList<Character> duplicateChars = new ArrayList<>();
for(int i=0; i<sb1.length();i++)
{
    /*For Finding duplicate in first string*/
    for(int j=i+1; j<sb1.length(); j++)
    {
        if(sb1.charAt(i) == sb2.charAt(j))
        {
            duplicateChars.add(sb1.charAt(i));
        }
    }
    /*For Finding duplicate in first and second string*/
    for(int j=i+1; j<sb1.length(); j++)
    {
        if(sb1.charAt(i) == sb2.charAt(j))
        {
            duplicateChars.add(sb1.charAt(i));
        }
    }

}

for(int i=0; i<sb2.length();i++)
{
    /*For Finding duplicate in second string only*/
    for(int j=i+1; j<sb2.length(); j++)
    {
        if(sb2.charAt(i) == sb2.charAt(j))
        {
            duplicateChars.add(sb2.charAt(i));
        }
    }
}

for(Character character : duplicateChars){
    name1 = name1.replace(character.toString(), "");
    name2 = name2.replace(character.toString(), "");
}

System.out.println(name1);
System.out.println(name2);

【讨论】:

  • 出于所有意图和目的,预期的输出应该已添加到原始问题中,以便那些试图回答的人更清楚。话虽如此,但这并不能回答问题。这个想法是只替换 name1 中字符的 第一个实例 和 name2 中的第一个匹配索引。所以“alpha”和“delta”会变成“pha”和“det”……“treehouse”和“street”会变成“houe”和“t”,等等。
猜你喜欢
  • 2014-02-19
  • 2013-11-12
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
相关资源
最近更新 更多