0

次を含むArraylistをソートしようとしています

[[2/11, 11/48], [8/35, 35/288], [16/43, 43/288], [4/5, 5/16], [75/152, 19/210], [135/163, 163/1680]]

現在、このArraylistを使用してソートしています

for(int j = 0; j < knowledgeD.size()-1; j++) {

            if(knowledgeD.get(j).get(0).compareTo(knowledgeD.get(j+1).get(0)) == 1) {
                Collections.swap(knowledgeD, j, j+1);   

これは、各ブラケットの最初の値である真理値を並べ替えます。2/11 8/35 など、値の観点から並べ替えます。最小から最大、

しかし、どこか途中でめちゃくちゃになっていて、4/5 と 75/132 を注文していないことに気付きました。その理由はわかりません。このフェイルセーフコードを追加して、明らかなことをしようとしましたが、

for(int k = 0; k < knowledgeD.size()-3; k++) {
                    if(knowledgeD.get(k).get(1).compareTo(knowledgeD.get(k+1).get(1)) == -1){
                        Collections.swap(knowledgeD, k-1, k+1);

ただし、このコードを実装したので、インデックス範囲外のエラーが発生し続けます。誰か手を貸してくれませんか?

乾杯、

シム

4

1 に答える 1

1

私が理解している限り、子リストの最初の要素の自然な順序に基づいてリストを並べ替えようとしています。Java では、これは通常コンパレータによって行われ、新しいメソッドを何かに追加する必要はありません。

  Comparator<List<Comparable>> order = new Comparator<List<Comparable>>() {
    @Override
    public int compare(List<Comparable> o1, List<Comparable> o2) {
      return o1.get(0).compareTo(o2.get(0));
    }
  };
  Collections.sort(knowledgeD, order);
于 2013-03-29T10:30:32.410 に答える