2

我在这里要做的是对正则表达式的发现进行排序(例如,如果它们是数字)。我不知道该怎么做,有什么想法吗?

NodeList abcList = firstElement.getElementsByTagName("target");
Element abcElement =(Element)abcList.item(0);
NodeList textAbcList = abcElement.getChildNodes();
String abc = (textAbcList.item(0).getNodeValue().trim());
Pattern pattern = Pattern.compile("Some Regex");
Matcher matcher = pattern.matcher(abc);
while (matcher.find()){
out.write(" abc: " + matcher.group());
}
4

1 回答 1

2

发现

要对结果进行排序,您需要先找到所有结果。如果您事先不知道所有结果,则可以生成任何部分排序列表。所以你会有类似的东西:

List<Integer> results = new ArrayList<Integer>();
while (there are more results) { // here you ask the regex if it found some more item
   // add integer to results
   String found = ... // here you grab the string you've just found
   results.add(Integer.parseInt(found)); // convert the string to integer and add to list
}

请注意,我将找到的字符串直接转换为 Integer,因为它作为 Integer 具有更多意义。如果出于任何原因你想要一个字符串,好的,有一个List<String>并且不要转换。

排序

在你有一个未排序的列表后,你需要对其进行排序。有几种方法,Java 实现了一种非常简单的方法。它可以进行任何类型的排序,因为它不进行两个项目之间的比较。这是唯一需要实现以定义如何排序的部分。你会做:

Collections.sort(results, comparator);

此方法将实现合并排序(如果我没记错的话)并在每次需要比较两个元素时询问您提供的比较器。这个比较器应该实现接口Comparator<T>whereT是结果中元素的类型。

如果它们是整数,则不需要比较器,因为它已经具有“自然”顺序:

Collections.sort(results);

但是如果你想要一些特殊的排序(比如根据它的整数表示的值排序字符串),那么你可以使用你自己的比较器:

Collections.sort(results, new Comparator<String>() {
   public int compare(String a, String b) {
      int valueA = Integer.parseInt(a);
      int valueB = Integer.parseInt(b);
      return valueA - valueB;
   }
});

比较必须返回:

  • 如果 a < b 则为负
  • 0 如果 a == b
  • 如果 a > b 则为正。

由于我们想像比较数字一样比较字符串,这就是我所做的:将它们转换为数字并比较它们的数值。

对字符串进行排序:xxx-nnnn-nnnn

在您的情况下,您正在收集具有该格式(abc-1234-5678)的字符串,您需要根据第一个数字对它们进行排序。所以让我们假设你已经收集了你的字符串:

List<String> results

然后,您需要根据一些任意标准对这些字符串进行排序。像往常一样,您需要调用Collections.sort提供一个特殊的比较器。

该比较器需要比较的不是整个字符串,而是每个字符串的第一个数字。例如:abc-1234-5678def-3456-1988。你必须与1234比较3456

然后代码将如下所示:

Collections.sort(results, new Comparator<String>() {
  public int compare(String str1, String str2) {
     // obtain the number you'll use to compare
     int value1 = getImportantNumber(str1);
     int value2 = getImportantNumber(str2);
     // return comparator (remember, the sign of the results says if it's <, =, >)
     return value1 - value2;
  }

  // this method will extract the number, maybe you'll need a regex or substring, dunno
  private int getImportantNumber(String str) {
     // by example
     Matcher m = PATTERN.matcher(str);
     if (!m.find())
        return -1; // or throw an exception, depends on you're requirements
     String numberPart = m.group(...); // the number of the group catching the part you need
     return Integer.parseInt(numberPart);
  }

  private static Pattern PATTERN = Pattern.compile("...."); 
});

哪个正则表达式

我应该使用:

(\w+)-(\d+)(-(\d+))*

这发现:

letters-numbers[-numbers[-numbers...]]

但是,如果您不确定是否能找到第二名的数字,我应该选择:

String[] parts = str.split("-");
for (String part: parts)
   if (this part has only numbers)
      return Integer.parseInt(part);
// if there are no only number parts
throw new RuntimeException("Not valid number part found!");
于 2012-09-28T09:35:18.770 回答