2015-02-23 98 views
1

我有一個ArrayList,其中包含超類和一些子類對象的對象。我們稱它們爲subclass1和subclass2。Java - 從超類的ArrayList中排序子類

有沒有一種方法可以去ArrayList和辨別哪些對象是SuperClass,subclass1和subclass2。所以我可以把它們放入ArrayList和ArrayList。

這是一個過於簡化的版本,但它展示了我希望做的事情。

public class food{ 
    private String name; 
    public food(String name){ 
     this.name = name; 
    } 
} 

public class pudding extends food{ 
    public pudding(String name){ 
     super(name); 
    } 
} 

public class breakfast extends food{ 
    public breakfast(String name){ 
     super(name); 
    } 
} 

public static void main(String args[]){ 
    ArrayList<food> foods = new ArrayList(); 

    foods.add(new food("Sausage")); 
    foods.add(new food("Bacon")); 
    foods.add(new pudding("cake")); 
    foods.add(new breakfast("toast")); 
    foods.add(new pudding("sponge")); 
    foods.add(new food("Rice")); 
    foods.add(new breakfast("eggs")); 

    ArrayList<pudding> puds = new ArrayList(); 
    ArrayList<breakfast> wakeupjuices = new ArrayList(); 

    for(food f : foods){ 
     //if(f is pudding){puds.add(f);} 
     //else if(f is breakfast){wakeupjuices.add(f);} 
    } 

} 
+2

查找'instanceof' – kuporific 2015-02-23 14:19:11

+0

非常感謝您 – TheOnlyWAR10CK93 2015-02-23 14:21:34

+0

只是對未來的祕訣:不相關的問題,但Java約定需要大寫的類名稱。這種語言並不需要它,但是當你與其他人一起發展時,如果你這樣做,你會發現你的體驗將會更加順利。 :-) – Tenner 2015-02-23 14:24:20

回答

2

您可以檢查所需的類型這樣,使用instanceof關鍵字:

for (food f : foods) 
{ 
    if (f instanceof pudding) 
     puds.add(f); 
    else if (f instanceof breakfast) 
     wakeupjuices.add(f); 
} 
+0

非常感謝 – TheOnlyWAR10CK93 2015-02-23 14:21:50

0

這是可以解決的優雅與番石榴使用Multimaps.index

Function<food, String> filterFood = new Function<food, String>() { 
     @Override 
     public String apply(food input) { 

      if (input instanceof pudding) { 
       return "puddings"; 
      } 
      if (input.b instanceof breakfast) { 
       return "breakfasts"; 
      } 
      return "something else"; 
     } 
    }; 

    ImmutableListMultimap<String, food> separatedFoods = Multimaps.index(list, filterFood); 

輸出將是一個番石榴Multimap與三個單獨的條目爲:

  1. 在關鍵「早餐」下的所有早餐實例的不變列表。
  2. 一個包含關鍵「布丁」下的所有布丁實例的不可變列表。
  3. 並且可能還有一個不可變的列表,其中包含每個食物實例的對象,這些實例在關鍵「別的東西」下既不是早餐也不是布丁。