2015-12-09 4 views
2

Для этой программы у меня есть аррайалист для животных, полный объектов из двух подклассов (класс «Рыба и тигр»). Мне сложно определить, как подсчитать каждый тип предмета, чтобы я мог Распечатай. Мне нужно, чтобы он сказал что-то вроде. Есть 3 тигры и 2 рыбы. Вот мой код до сих порПодсчет количества различных типов объектов в ArrayList

import java.util.*; 
public class Menagerie{ 
    public static void main(String [] args){ 
     /* ArrayList to hold animal data */ 
     ArrayList<Animal> alist = new ArrayList<Animal>(); 
     /* object creations */ 
     Tiger jtiger = new Tiger("Javan Tiger", "Tiger acreage #6"); 
     Fish fnfish = new Fish("False network catfish", "Fresh Water"); 
     Tiger btiger = new Tiger("Bengal tiger", "Ritchie area of RIT"); 
     Fish shark = new Fish("Shark", "Salt Water"); 
     Tiger stiger = new Tiger("Siberian Tiger", "Tiger acreage #4"); 

     /* Adding objects to alist ArrayList */ 

     alist.add(jtiger); 
     alist.add(fnfish); 
     alist.add(btiger); 
     alist.add(shark); 
     alist.add(stiger); 

     /* printing out animal information using toString() */ 

     System.out.println("Report on animals..."); 
     System.out.println(jtiger.toString()); 
     System.out.println(fnfish.toString()); 
     System.out.println(btiger.toString()); 
     System.out.println(shark.toString()); 
     System.out.println(stiger.toString()); 





    } 


} 

Любая помощь будет здорово! Благодарю.

+0

Просто петля через 'alist' и проверить экземпляр каждого объекта –

+0

' instanceof' oper ator: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html – markspace

ответ

2

1.) Итерация над alist.

for(Animal animal : alist){ 

} 

2.) Есть два счетчика, один для tigerCount и другой для fishCount.

3.) Проверьте на instanceOf class и increment соответственно.

for(Animal animal : alist){ 
     if(animal instanceOf Fish){ 
       fishCount++; 

     }else if(animal instanceOf Tiger){ 
      tigerCount++; 
     } 
    } 

instanceof ключевое слово бинарный оператор используется для проверки, если объект (экземпляр) является подтипом данного типа.

InstanceOf оператор используется для проверки типа объекта во время выполнения. Это способ, с помощью которого ваша программа может получить во время выполнения тип информацию об объекте. instanceof оператор также важен в случае объекта литья во время выполнения. InstanceOf возвращения оператора логическое значение , если ссылка на объект указанного типа, то он вернуть истинно иначе ложные.

+0

Спасибо, это была большая помощь, и я понял это. – BrianAndris

+0

@BrianAndris pls принимают ответ –

0

Я создал минимальный компилируемый пример, поэтому он не использует ваши уже существующие классы.

public class Main { 
    public static void main(String... args) { 
     List<Animal> animals = new ArrayList<Animal>(); 

     //create animals 
     for (int i = 0; i < 5; i++) 
      animals.add(new Dog()); 
     for (int i = 0; i < 3; i++) 
      animals.add(new Cat()); 
     for (int i = 0; i < 8; i++) 
      animals.add(new Cow()); 

     //create HashMap with class type as key 
     Map<String, Integer> types = new HashMap<>(); 

     for (Animal a : animals) { 
      Integer count = types.get(a.getClass().getSimpleName()); 
      //if count is null then we need to create a new entry with the value of 1 
      //otherwise just increase count and replace 
      types.put(a.getClass().getSimpleName(), count == null ? 1 : ++count); 
     } 

     //go through each entry and print it out 
     for(Map.Entry<String, Integer> x : types.entrySet()){ 
      System.out.println(x.getKey() + " -> Total " + x.getValue()); 
     } 
    } 

    //ignore static. just because i'm using main method 
    static class Animal{} 
    static class Dog extends Animal{} 
    static class Cat extends Animal{} 
    static class Cow extends Animal{} 

} 
0

Более обобщенно применимо решение заключается в следующем:

// Map captures {Type => #Animals} 
Map<String,Integer> animalCount = new HashMap<>(); 
for(Animal animal : alist) 
    { 
    String className = animal.getClass().getName(); 
    Integer count = animalCount.get(className); 
    if(count == null) 
     { 
     // First time we've seen this type of Animal 
     animalCount.put(className, 1); 
     } 
    else 
     { 
     // We've seen this type of Animal at least once 
     animalCount.put(className, count + 1); 
     } 
    } 

// Print out a series of lines like "There were 7 Tiger(s)" 
for(Map.Entry<String,Integer> reportRow : animalCount.entrySet()) 
    { 
    System.out.println("There were "+reportRow.getValue() + " " + reportRow.getKey()+"(s)"); 
    } 
0

Java8 версия, если вам нравится

Map<Class<? extends Animal>, List<Animal>> counted = alist.stream().collect(Collectors.groupingBy(anmial -> { 
     if (anmial instanceof Tiger) return Tiger.class; 
     if (anmial instanceof Fish) return Fish.class; 
     return null; 
    })); 

    System.out.println(MessageFormat.format("There are {0} tigers and {1} fishes", counted.get(Tiger.class).size(), counted.get(Fish.class).size())); 

Посмотрите на ява документы для более подробно: https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html