2016-05-03 6 views
5

私は学校で働いているプログラムの幅広い検索機能に取り組んでいます。そして、私が可能なエッジをどのように通過しているかによって、特定のノードの外向きエッジを通過するとき、それはこのようなものになります。どのようにArrayList <ArrayList <String>>を並べ替えることができますか?

[[A, 1], [D, 1], [C, 2], [D, 2]] 

をしかし、私が本当にしたいことはこれです:

[[A, 1], [C, 2], [D, 1], [D, 2]] 
ペアの最初のインデックスは、その辺がポイントにノードの名前です

、および2番目のインデックスはエッジのラベルです。基本的には、これらの辺をアルファベット順に、最初にノード名で、次にラベル名で渡したいと思いますが、Collections.sort()は2D ArrayListでは機能しないので、その方法はわかりません。これを整理するための良い方法に関するすべてのポインタ/アイデア?みんな、ありがとう!

編集:私はありません1.8

+0

'[[A、1]、[D 1]、 '' ArrayList > ' の正しい例ではありません。自然な順序で並べ替えたり、カスタム 'Comparator' –

+0

ArrayListの代わりにHashMapを使用することができます... – RoiEX

+1

RoiEXは、異なる値を持つキーを持つことができるため、HashMapを使用できませんでした。また、HashMap それは何かのための非常に複雑な構造を単純にします。 – jeorfevre

答えて

2

は、ここで完全な作業コードで、この割り当てのためにJRE 1.7を使用しています。 java SDK8でラムダ式を処理しています。

ご覧のとおり、単純なクラスとコンパレータを追加しました。これは簡単で強力です。

package com.rizze.test.labs.sof; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 

import org.junit.Test; 

public class SOF {  

    public static class Link { 
     public String name; 
     public int id; 

     public static Link build(String n, int i){ 
      Link l = new Link(); 
      l.name = n; 
      l.id=i; 
      return l; 
     } 

     public String toString(){ 
      return String.format("[%s , %d]", name,id); 
     }   
    }  

    @Test 
    public void test() { 

     List<Link> links = new ArrayList<Link>(); 

     //SSETUP [[A, 1], [C, 2], [D, 1], [D, 2]] 
     links.add(Link.build("D", 1)); 
     links.add(Link.build("A", 1)); 
     links.add(Link.build("D", 2)); 
     links.add(Link.build("C", 2)); 


     Collections.sort(links, new Comparator<Link>() {  
      @Override 
      public int compare(Link p1, Link p2) { 
       int ret = p1.name.compareTo(p2.name); 
       if(ret == 0) { 
        ret= p1.id - p2.id; 
       } 
       return ret;    
      }    
     }); 
     System.out.println(links);   
    }  
} 

//コンソール出力

Before : [[D , 1], [A , 1], [D , 2], [C , 2]] 
Sorted: [[A , 1], [C , 2], [D , 1], [D , 2]] 

// GISTリンク https://gist.github.com/jeorfevre/cbcd7dac5d7fabde6a16db83bdfb7ef5

2

@jeorfevreの答えは完全に大丈夫です。あなたはJavaのバージョンは言及していませんでしたが、私は静的なComparatorメソッドを使用します。

ソリューションは、宣言型となり、簡潔な方法であなたをより多くの制御と明快さを与える:あなたが逆の順序をしたい場合は

public class Test { 
    public static class Edge { 
     private String name; 
     private int label; 
     public Edge(String name, int id) { 
      this.name = name; 
      this.label = id; 
     } 
     public String toString() { 
      return String.format("[%s , %d]", name, label); 
     } 
     public String getName() { return name; } 
     public int getLabel() { return label; } 
    } 


    public static void main(String[] args) { 
     List<Edge> edges = new ArrayList<>(); 
     edges.add(new Edge("D", 1)); 
     edges.add(new Edge("A", 1)); 
     edges.add(new Edge("D", 2)); 
     edges.add(new Edge("C", 2)); 

     Comparator<Edge> comparator = Comparator 
       .comparing(Edge::getName) 
       .thenComparing(Edge::getLabel); 

     edges.sort(comparator); 

     System.out.println(edges); 
    } 
} 

  Comparator<Edge> comparator = Comparator 
       .comparing(Edge::getName) 
       .thenComparing(Edge::getLabel) 
       .reversed(); 

あなたが与える:

[[D , 2], [D , 1], [C , 2], [A , 1]] 

および

  Comparator<Edge> comparator = Comparator 
       .comparing(Edge::getName) 
       .reversed() 
       .thenComparing(Edge::getLabel); 

出力である: [[D 1]、[D]、[2]、[C]、[2]、[A、1]]

+0

これは素晴らしいですね!それは私が実装しようと考えていたもの(Edgeクラス)とほぼ同じですが、エッジをどのように管理すべきかについてもう少し視点があります。私の次の質問は、Edgeクラスの内部ではなく、まったく異なるクラスでこれらのエッジを扱っているので、コンパレータをどこに置くのですか?それは私が現在取り組んでいる機能の中に入るのだろうか?お詫び申し上げますが、私はJavaには比較的新しく、コンパレータには新しくありません。 –

+0

また、私はEdge :: getNameとEdge :: getLabelというコマンドに問題があります。なぜなら、この割り当てのために私の教授は私たちが1.8ではなくJRE 1.7を使用したいからです。 JRE 1.7を使用してこれを実装する別の方法はありますか? –

関連する問題