gpt4 book ai didi

java - 将正则表达式添加到列表中进行排序

转载 作者:行者123 更新时间:2023-11-30 09:32:06 25 4
gpt4 key购买 nike

我在这里要做的是对正则表达式结果进行排序(例如,如果它们是数字)。我不确定如何去做,有什么想法吗?

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());
}

最佳答案

发现

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

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
}

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

排序

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

Collections.sort(results, comparator);

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

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

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 。您必须将 12343456 进行比较。

然后代码看起来像这样:

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!");

关于java - 将正则表达式添加到列表中进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12637070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com