1

我正在考虑获取字符串中所有唯一重复并按长度和重复频率(数字)对它们进行排序的最佳方法

我从这段代码开始

 public static void main(String[] args)
{
  String s = "AAAABBBBAAAANNNNAAAABBBBNNNBBBBAAAA";
  Matcher m = Pattern.compile("(\\S{2,})(?=.*?\\1)").matcher(s);
  while (m.find())
  {
    for (int i = 1; i <= m.groupCount(); i++)
    {
      System.out.println(m.group(i));
    }
  }
}

并希望对有这样的输出有一些建议:

AAAA 4 1,9,17,33 等

其中 4=重复次数,1,9,17,33 个位置

我感谢您的帮助

4

1 回答 1

5

首先,你的模式不会给你你想要的。您应该将您的正则表达式更改为: -

"(\\S)\\1+"

获得单个字符的重复。

现在要获取重复的位置和次数,您可以维护一个Map<String, List<Integer>>, 来存储每个重复的位置。

此外,您不需要forwhile. while 循环足以遍历所有模式。

这是您修改后的代码:-

Map<String, List<Integer>> map = new HashMap<String, List<Integer>>();

String s = "AAAABBBBAAAANNNNAAAABBBBNNNBBBBAAAA";
Matcher m = Pattern.compile("(\\S)\\1+").matcher(s);

while (m.find())
{
    String str = m.group();
    int loc = m.start();

    // Check whether the pattern is present in the map.
    // If yes, get the list, and add the location to it.
    // If not, create a new list. Add the location to it. 
    // And add new entry in map.

    if (map.containsKey(str)) {
        map.get(str).add(loc);

    } else {
        List<Integer> locList = new ArrayList<Integer>();
        locList.add(loc);
        map.put(str, locList);
    }

}
System.out.println(map);

输出 : -

{AAAA=[0, 8, 16, 31], BBBB=[4, 20, 27], NNNN=[12], NNN=[24]}
于 2012-12-05T19:29:29.873 回答