【问题标题】:java String on repetition of alphabetsjava字符串重复字母
【发布时间】:2012-09-05 14:20:08
【问题描述】:

我是一个 java 菜鸟,我有一个特殊的问题。 让我们考虑一个字符串,其中包含多个重复的字母:

String a="AAABBBAACCBBDD"

我已经多次尝试使用for 和charAt。 预期输出:

"ABCD"

此操作是否有任何内置函数以及获得输出的任何想法?

【问题讨论】:

  • 您在最接近解决方案的时候使用了什么代码?
  • 请发布您目前拥有的内容。我们希望看到您付出一些努力。
  • 我不明白这个问题。只需遍历字符并记住您到目前为止找到的那些......例如通过使用集合
  • 使用 inbult String b=a.charAt(0) 然后用 for by String length 循环。 for(int i=0;i<=((a.length())-1);i++) 然后是 if 与 charAt if((a.charAt(i))!=(b.charAt(i)) 进行比较。我很困惑
  • @home: 如果我通过 Scanner 语句从用户那里得到字符串“a”怎么办

标签: java string


【解决方案1】:

您可以遍历字符串的字符以构建一组唯一字符:

String a = "AAABBBAACCBBDD";
Set<Character> charSet = new HashSet<String>();
for (char c : a.toCharArray())
{
    charSet.add(c);
}

然后您可以将集合转换为列表并对其进行排序以用于显示/toString()目的:

List<Character> uniqueCharList = new ArrayList<Character>(charSet);
Collections.sort(uniqueCharList);

// Convert List<Character> to char[]
// see http://stackoverflow.com/q/6649100/139010 for a more concise library call
char[] uniqueCharArray = new char[uniqueCharList.size()];
for (int i=0; i<uniqueCharArray.length; i++)
{
    uniqueCharArray[i] = uniqueCharList.get(i);
}

String result = new String(uniqueCharArray);

【讨论】:

  • 我会使用 LinkedHashSet 来保持顺序。 ;)
  • 不提供字典顺序。完成后最好使用List,IMO 进行排序。
  • 不清楚 OP 是想要外观顺序还是 ASCIIbetical 顺序。
  • 然后您可以将集合转换为列表并对其进行排序以用于 display/toString() 目的。该怎么做?
【解决方案2】:

我会做类似的事情

public static String dedup(String text) {
    Set<Character> seen = new LinkedHashSet<Character>();
    StringBuilder sb = new StringBuilder();
    for (char c : text.toCharArray())
        if (seen.add(c))
            sb.append(c);
    return sb.toString();
}

【讨论】:

  • +1;但如果字母表是CBAAABBBAACCBBDD,则链接集将失败。根据要求,可能需要对最终集合进行排序...
  • @home 链接集如何失败?这将按出现顺序打印CBAD。
  • 这正是我所说的“要求”的意思——输出可能必须按字典顺序/自然顺序提供(ABCD 而不是CBAD)。
  • @all: 蓝色文字是什么意思?
  • @Peter:好的,“失败”可能是错误的术语(当然它不会失败,道歉),我只是说可能没有必要更喜欢 LinkedHashSet(再次取决于要求)。
【解决方案3】:

您不需要列表或设置为此。只是 String 来存储一切。我希望这没有错误。

String result = "";
for(int i = 0; i < a.length(); i++) 
    if(!result.contains(a[i])) {
           result += a[i];          
    }

【讨论】:

  • -1。这将具有可怕的渐近运行时性能。对String#contains() 的每次调用都是O(n),循环中的字符串连接是O(n²)。
  • 理论上可行,但如果字符串非常长怎么办?重新考虑你的方法。
猜你喜欢
  • 2016-07-06
  • 2019-12-24
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 2017-03-11
  • 1970-01-01
相关资源
最近更新 更多