2016-10-03 18 views
0

に基づいて、私は属性label & valueとオブジェクト・クラス、Projectを有します。私はセット内にオブジェクトを格納しています。問題は、あらかじめ定義されたラベルの順序に基づいてオブジェクトの属性を取得する必要があることです。私はTreeSetに同じを実装するコンパレータを提供する方法を理解することができません。ソートオブジェクト特定の所定の順序

public class Project { 

    String label; 

    String value; 

    //Setters & getters 
} 

    project1.setLabel("Project Name"); 
    project1.setValue("Solar Project"); 

    project2.setLabel("Project Type"); 
    project2.setValue("Government"); 

私は期待していた出力は

プロジェクト名=ソーラープロジェクト、プロジェクトの種類=政府

である。しかし、それは設定されているので、順序は常に同じではありません。

私はHashMap & TreeMapコンボで同じことができます。

Map<Integer, String> detailsHashMap = new HashMap<Integer, String>(); 
switch (person.getLabel()) { 
    case "Project Name": 
      detailsHashMap.put(1, person.getValue()); 
      break; 
    case "Project Type": 
      detailsHashMap.put(2, person.getValue()); 
      break; 
    default: 
      break; 
} 

Map<Integer, String> treeMap = new TreeMap<Integer, String>(detailsHashMap); 

私は常にオブジェクトが順番に表示されたい

"プロジェクト名": "ソーラープロジェクト"、 "プロジェクトの種類": "政府"

注:

i)プロジェクトクラスに追加の整数フィールドを追加し、それに基づいてソートするのは回避策ですが、これらの値はjsonで使用されるため使用できません。大規模な変更が

を必要とされるので

II)マップするための設定から変更することはできません私はTreeSetのまたはSetのいずれかのimplmentationを達成することができます方法はありますか?あなたは以下のように、compareToメソッドをオーバーライドするメソッドを追加する必要があり、プロジェクトのクラスには、事前

答えて

1

は、コンストラクタにComparatorを渡す - java8

Set<Project> projects = new TreeSet<>((o1, o2) -> { 
    if (o1.getLabel().equals("foo")) return -2; 
    if (o1.getLabel().equals("Solar")) return -1; 
    if (o1.getLabel().equals("Gov")) return 1; 
    return 0; 
}); 

Set<Project> projects = new TreeSet<>(new Comparator<Project>() { 
    @Override 
    public int compare(Project o1, Project o2) { 
     if (o1.getLabel().equals("foo")) return -2; 
     if (o1.getLabel().equals("Solar")) return -1; 
     if (o1.getLabel().equals("Gov")) return 1; 
     return 0; 
    } 
}); 

またはラムダを使用してのように今、自分の価値観を常にコンパレータにセットのようにソートされます。

public class FooTestApplication { 

    public static void main(String[] args) { 
     Project p = new Project(); 
     p.setLabel("Solar"); 
     p.setValue("foo"); 
     Project p2 = new Project(); 
     p2.setLabel("Gov"); 
     p2.setValue("foo2"); 
     Project p3 = new Project(); 
     p3.setLabel("foo"); 
     p3.setValue("foo3"); 
     Set<Project> projects = new TreeSet<>((o1, o2) -> { 
      if (o1.getLabel().equals("foo")) return -2; 
      if (o1.getLabel().equals("Solar")) return -1; 
      if (o1.getLabel().equals("Gov")) return 1; 
      return 0; 
     }); 
     projects.add(p); 
     projects.add(p2); 
     projects.add(p3); 

     projects.iterator().forEachRemaining(pp -> { 
      System.out.println(pp.getLabel()); 
     }); 
    } 
} 

出力:

foo 
Solar 
Gov 
+0

素晴らしい!カスタムCompartorの実装は、私が探していたものです。それは魅力のように働いた:) – RahulArackal

0

ありがとう:あなたはTreeMapのに項目を追加するとき

@Override 
public int compareTo(String s1, String s2) { 
    // ordering logic 
} 

は、今では秩序を維持しますあなたがしたいこと。 TreeSetを作成するとき

関連する問題