Problem 5. Generic Count Method Strings
Здравейе,
моля за помощ със задачата. Не мога да се справя, ето какво съм написал:
package genericBox; public class Box <T extends Comparable<T>> implements Comparable<T>{ private T box; public Box(T box) { this.setBox(box); } public T getBox() { return box; } private void setBox(T box) { this.box = box; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(box.getClass().getName()).append(String.format(": %s",box)); return sb.toString(); } @Override public int compareTo(T o) { return this.getBox().compareTo(o); } }
package genericBox; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); List<Box> boxes = new ArrayList<>(); try { int lines = Integer.valueOf(reader.readLine()); for (int i = 0; i < lines; i++) { Box box = new Box(reader.readLine()); boxes.add(box); } Box boxToCompare = new Box(reader.readLine()); System.out.println(countGreater(boxes, boxToCompare)); } catch (IOException e) { e.printStackTrace(); } } public static <E extends Comparable<E>> int countGreater(List<E> list, E element) { int counter = 0; for (E box : list) { if (box.compareTo(element)==1){ counter++; } } return counter; } }
Имаш лист от някакви обекти, който компилатора не знае какви са. Трябва да му кажеш точно какво ще compareваш. Име, стойност и т.н нещо което има реална стойност
Всъщност мисля ,че трябва да каже експлицитно че Box ще бъде Box<String> така ще знае да compare-va String-ове ,
Защото ти в класа му казваш ,че ще работи с T елементи обаче при инициализация не му слагаш в <> нищо и то работи с Object.
Аз мисля, че идеята е да не се знае от какъв тип ще е "Box", а само да е "Comparable". Иначе ако кажа, че листа е от "String" и "Box" е от тип "String" то тогава, защо ми е "Box"? Ето така работи, но според мен не трябва да е така.
Защо да не му казваш от какви елементи ще е ? Защо тогава типизираш List<String> ?
Абсолютно същото е , а идеята е тоя бокс да работи с каквито и да е Т елементи които му подадеш . Не е коректно обаче 1 бокс да може да събира всякакви типове в себе си , така ще се счупи логиката , защото как ще comparevash Integer и String?
List<Box> е ок. Просто като правиш new Box, казвай че ще е от стрингове Box<String> box = new ...
Не става и със Box<String>.