【问题标题】:Removing duplicate values from StringBuffer从 StringBuffer 中删除重复值
【发布时间】:2015-06-24 16:53:03
【问题描述】:

我有一个 StringBuffer,其中包含重复值,如示例左侧所示的值,并希望将其转换为右侧的显示值。两种情况如下所示

{1,1,1,2,2,} to `{1,2}` 

{a,a,a,b,c,c,c,}{a,b,c}

还请注意,StringBuffer 的内容和大小不是固定的。我想通过字符串操作来解决这个问题。

【问题讨论】:

  • 您可以使用indexOflastIndexOf 来完成此操作。到目前为止,您尝试过什么?
  • 这样做的问题是索引可以是任何东西。大小不是预先确定的。
  • ...不,这没有问题...查看文档:docs.oracle.com/javase/7/docs/api/java/lang/…
  • 您是在谈论从支持数组中删除重复字符,还是对字符串操作感兴趣?
  • 在这种情况下我想要字符串操作。

标签: java stringbuffer


【解决方案1】:

这是一个适用于相邻的重复项的解决方案。虽然有点笨重...

//Deletes all extra occurrences of String x(which can just be a single character)
public static StringBuffer removeDuplicateOf(StringBuffer s, String x){
    while(s.indexOf(x) != s.lastIndexOf(x))
        s.deleteCharAt(s.lastIndexOf(x));
    return s;
}

注意,如果您不知道哪些项目是重复的,则必须在 StringBuffer 中的每个项目上调用它。 (在您的 StringBuffer 中,每个 unique 项一次。)

例如你可以这样做:

StringBuffer s = new StringBuffer("1,2,4,8,16,1,2,4,6,8,10,12,14,16,");
s.removeDuplicateOf(s, "1,");

这将避免从“16”、“10”等中删除“1”,同时仍然删除其他出现的“1”。

【讨论】:

    【解决方案2】:
    String s = "1,1,1,2,2";
    System.out.println(s.replaceAll("(.)\\1+", "$1"));
    

    【讨论】:

    • 这将删除彼此相邻的重复项。但是,如果 OP 想要删除所有重复项,它就不会这样做。
    • 完全正确,仅适用于彼此相邻的重复项。即使是逗号分隔也会阻止替换。
    • 您可能想使用类似s.replaceAll("(.*?,)\\1+", "$1") 的东西。但即使这样也只有当重复的数字像问题中一样彼此相邻时才有效。
    猜你喜欢
    • 2011-03-17
    • 2013-04-20
    • 2014-03-25
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2021-04-02
    相关资源
    最近更新 更多