0

私は次のシナリオのためのより良い最適化されたソリューションを見つけようとしていました。
私はarrayListを持っています

ArrayList<Order> orders = new ArrayList<Order>();  

並べ替えられた結果の値は次のとおりです。

    {  
     medicine,    
     medicine,  
     milk,    
     milk,    
     pillow,  
     Soap,         
     toy       
}  

そして、これらすべてのアイテムの ENUM があります。

public Enum Items{  
PILLOW("pillow"),  
HARDDISK("harddisk"),  
MILK("milk"),  
SOAP("soap"),  
MEDICINE("medicine"),  
TOY("toy")    
}

私の出力順序は次のようになります

{    
milk,  
milk,  
harddisk,  
medicine,  
medicine,  
toy,  
soap,  
pillow  
}  

これを達成するために私がやろうとしていたのは

ArrayList<Order> resultList = new ArrayList<Order>();  
for(Order order: orders){  
if(order.getItemName.equals(Items.MILK){  
resultList.add(order);  
}    

for(Order order: orders){    
if(order.getItemName.equals(Items.MEDICINE){  
resultList.add(order);    
}  

.......  

for(Order order: orders){  
if(order.getItemName.equals(Items.PILLOW){  
resultList.add(order);  
}  

上記のアプローチに従えば、上記の指定された順序で出力順序を取得できますが、ここで多くの for ループをループしているため、最適化されたアプローチの提案が必要です。

出力は、次の順序に基づいてソートする必要があります

1) 牛乳 2) ハードディスク 3) 薬 4) おもちゃ 5) 石鹸 6) まくら

4

3 に答える 3

4

その代わりにCollections#sort(list,comparator)、カスタムコンパレータを渡して、特定の順序で結果を取得できる場所を使用できます。

Collections.sort(list, new Comparator<Order>() {

    @Override
    public int compare(Order obj1, Order obj2) {
         // write the custom logic 
         // a negative integer, zero, or a positive integer as the first argument
         // is less than, equal to, or greater than the second
         return 0;
    }
});
于 2013-02-16T18:48:15.023 に答える
3

列挙型には、列挙型メンバーの宣言の順序である自然順序があります。したがって、指定した順序が必要な場合は、列挙型を次のように宣言する必要があります。

public Enum Item {  
    MILK("milk"),  
    HARDDISK("harddisk"),  
    MEDICINE("medicine"),  
    TOY("toy"),
    SOAP("soap"),  
    PILLOW("pillow");    
}

そして、次のように注文を並べ替えることができます。

Collections.sort(orders, new Comparator<Order>() {
    @Override
    public int compare(Order o1, Order o2) {
        return o1.getItem().compareTo(o2.getItem());
    }
}); 

列挙型を変更できない場合は、次のトリックを使用します。

private static final List<Item> ITEMS_IN_ORDER = Arrays.asList(new Item[] {
    Item.MILK,  
    Item.HARDDISK,  
    Item.MEDICINE,  
    Item.TOY,
    Item.SOAP,  
    Item.PILLOW
});

...

Collections.sort(orders, new Comparator<Order>() {
    @Override
    public int compare(Order o1, Order o2) {
        return Integer.compare(ITEMS_IN_ORDER.indexOf(o1.getItem()),
                               ITEMS_IN_ORDER.indexOf(o2.getItem()));
    }
});
于 2013-02-16T18:51:48.187 に答える
0

1つの代替手段として、列挙型クラスを次のように変更します

public Enum Items{ 
 MILK("milk",1),     
 HARDDISK("harddisk",2),
 MEDICINE("medicine",3),  
 TOY("toy",4)  
 SOAP("soap",5),  
 PILLOW("pillow",6), 

 private String name;
 private sortValue;


Items(double name, double sortValue) {
    this.name= name;
    this.sortValue= sortValue;
} 
}

コンパレータを使用して、並べ替え値に基づいて並べ替える

Collections.sort(list,new Comparator<Fruit>() {

        public int compare(Items item1, Items item2) {
                   return item1.sortValue - item2.sortValue;

});

JB Nizet よりも優れている点の 1 つは、Enum クラスで値を宣言する順序に依存しないことです。

于 2013-02-16T18:59:03.487 に答える