2015-02-23 3 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

+0

Большое спасибо – TheOnlyWAR10CK93

+0

Просто совет для будущего: не связанный с вашим вопросом, но Java-соглашения требуют кэширования имен классов. Язык не требует этого, но когда вы перейдете к разработке с другими людьми, вы обнаружите, что ваш опыт будет намного более плавным, если вы это сделаете. :-) – Tenner

ответ

2

Вы можете проверить желаемых типов, как это, используя instanceof ключевое слово:

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

Большое спасибо – TheOnlyWAR10CK93

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); 

Выходной сигнал будет Guava Multimap с тремя отдельными записями для:

  1. непреложный список со всеми экземплярами завтрака под ключ «завтраки».
  2. непреложный список со всеми экземплярами пудинга под ключевыми «пудингами».
  3. и, возможно, непреложный список с объектами с каждым пищевым экземпляром, который не является ни завтраком, ни пудингом под ключом «что-то еще».
Смежные вопросы