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
}

見つかった文字列は整数としての意味が大きいため、直接整数に変換していることに注意してください。何らかの理由で文字列が必要な場合は、[OK]をクリックし、List<String>変換しないでください。

並べ替え

ソートされていないリストを作成したら、それをソートする必要があります。いくつかの方法があり、Javaは1つの非常に簡単な方法を実装しています。2つのアイテム間の比較を行わないため、任意のタイプの並べ替えを行うことができます。これは、ソート方法を定義するために実装する必要がある唯一の部分です。そして、あなたはします:

Collections.sort(results, comparator);

このメソッドは、マージソートを実装し(私が間違っていない場合)、2つの要素を比較する必要があるたびに提供するコンパレーターに要求します。このコンパレータは、結果の要素のタイプである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の場合は負
  • a==bの場合は0
  • a>bの場合は正。

文字列を数字のように比較したいので、それを実行しました。文字列を数値に変換して、数値を比較します。

ポルノを並べ替える:xxx-nnnn-nnnn

あなたの場合、あなたはそのフォーマット(abc-1234-5678)で文字列を収集していて、最初の番号に従ってそれらをソートする必要があります。それで、あなたがすでにあなたの文字列を集めたと仮定しましょう:

List<String> results

次に、任意の基準に従ってその文字列を並べ替える必要があります。いつものように、あなたはCollections.sort特別なコンパレータを提供することを呼び出す必要があります。

そのコンパレータは、文字列全体ではなく、各文字列の最初の数値を比較する必要があります。例:abc-1234-5678およびdef-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...]]

しかし、2番目の場所で数字を見つけることがわからない場合は、次のことを行う必要があります。

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 に答える