2016-06-25 11 views
-1

Apacheソースアーカイブの名前(文字列)をソートする方法。 私はJsoupで以下のコードを試しましたが、与えられた期待どおりの結果を返していません。 この問題を解決するには?Javaの場合、文字列をソートするには、内部に数字が含まれていれば?

public static void getApacheArchives() throws IOException{ 
    String url = "https://archive.apache.org/dist/httpd/"; // or whatever goes here 
    Document document = Jsoup.connect(url).followRedirects(false).timeout(60000/*wait up to 60 sec for response*/).get(); 

    Elements anchors = document.body().getAllElements().select("a"); 

    Collections.sort(anchors, new Comparator<Element>() { 
     @Override 
     public int compare(Element e1, Element e2) { 
      return e1.text().compareTo(e2.text()); 
     } 
    }); 

    for (int i = 0; i < anchors.size(); i++) { 
     Element a = anchors.get(i); 
     if ( 
       (a.text().matches("(apache_)[1].[0-9].[0-9]{1,2}.(tar.gz)")) 
       || 
       (a.text().matches("(httpd-)[0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2}.(tar.gz)")) 
      ){ 
      System.out.println(a.text()); 
     } 
    } 
} 

結果、以下のこのコードリターン:
...
のhttpd-2.3.6.tar.gz
のhttpd-2.3.8.tar.gz
のhttpd-2.4.1.tar。 GZ
のhttpd-2.4.10.tar.gz
のhttpd-2.4.12.tar.gz
のhttpd-2.4.16.tar.gz
のhttpd-2.4.17.tar.gz
のhttpd-2.4 .18.tar.gz
のhttpd-2.4.2.tar.gz
のhttpd-2.4.20.tar.gz
のhttpd-2.4.3.tar.gz
のhttpd-2.4.4.tar.gz
のhttpd-2.4.6 .tar.gzの
のhttpd-2.4.7.ta​​r.gz
のhttpd-2.4.9.tar.gz
...

しかし、期待される結果は以下の通りです:
...
httpd-2.3.6.tar.gz
httpd-2.3.8.tar.gz
のhttpd-2.4.1.tar.gz
のhttpd-2.4.2.tar.gz
のhttpd-2.4.3.tar.gz
のhttpd-2.4.4.tar.gz
のhttpd-2.4。 6.tar.gz
のhttpd-2.4.7.ta​​r.gz
のhttpd-2.4.9.tar.gz
のhttpd-2.4.10.tar.gz
のhttpd-2.4.12.tar.gz
httpd-2.4.16.tar.gz
httpd-2.4.17.tar.gz
httpd-2.4.18.tar.gz
httpd-2.4.20.tar.gz
...

+0

質問は何ですか?出力はまさに予想どおりで、 ".10"は ".2"の前にソートされています。これは、その順序が文字列であるためです。コード内の何もそれに対処しようとしません。文字列をパーツに(おそらく正規表現で)解析するコードを記述し、文字列部分を文字列として比較し、個々の数字部分を数字として比較する必要があります。だからそれをしようとすると、あなたが問題に遭遇した場合は、それをしようとするあなたのコードに関する特定の質問をしてください。 –

+0

あなたはアンカーの数字を抽出してコンパレータと比較する必要があります。ここでは混合物のテキストを比較しています –

答えて

0

ありがとうTom、私は私の問題を解決しました! Sorting Strings that contains number in Java

いくつかの変更:

Collections.sort(anchors, new Comparator<Element>() { 
     public int compare(Element o1, Element o2) { 
      return extractInt(o1.text()) - extractInt(o2.text()); 
     } 

     int extractInt(String s) { 
      String num = s.replaceAll("\\D", ""); 
      // return 0 if no digits found 
      return num.isEmpty() ? 0 : Integer.parseInt(num); 
     } 
    }); 
+1

次に答えをコピーする代わりに、重複を受け入れてください。 – Tom

関連する問題