Loading...
mighty_hasu avatar mighty_hasu 1 Точки

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

 

Тагове:
0
C# OOP Basics
mighty_hasu avatar mighty_hasu 1 Точки

Задачата е от курса Java OOP Advanced / Generics / Problem 5.

https://softuni.bg/trainings/1376/java-advanced-oop-july-2016

В общи линии това е условието на задачата:

Create a method that receives as argument a list of any type that can be compared and an element of the given type. The method should return the count of elements that are greater than the value of the given element. Modify your Box class to support comparing by value of the data stored.

 

Когато компилирам програмата ми хвърля Exception: genericBox.Box cannot be cast to java.lang.String. Не работи "compareTo" метода на "Box".

0
AntonPortenov avatar AntonPortenov 102 Точки

Имаш лист от някакви обекти, който компилатора не знае какви са. Трябва да му кажеш точно какво ще compareваш. Име, стойност и т.н нещо което има реална стойност 

1
kaloyannikov avatar kaloyannikov 531 Точки

Всъщност мисля ,че трябва да каже експлицитно че Box ще бъде Box<String> така ще знае да compare-va String-ове ,

Защото ти в класа му казваш ,че ще работи с T елементи обаче при инициализация не му слагаш в <> нищо и то работи с Object.

 

0
31/07/2016 14:15:28
mighty_hasu avatar mighty_hasu 1 Точки

Аз мисля, че идеята е да не се знае от какъв тип ще е "Box", а само да е "Comparable".  Иначе ако кажа, че листа е от "String" и "Box" е от тип "String" то тогава, защо ми е "Box"? Ето така работи, но според мен не трябва да е така.

 

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) throws IOException {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        List<String> boxes = new ArrayList<>();
   
            int lines = Integer.valueOf(reader.readLine());
            for (int i = 0; i < lines; i++) {                
                Box box = new Box(reader.readLine());
                boxes.add(String.valueOf(box));                
            }

            Box boxToCompare = new Box(reader.readLine());

            System.out.println(countGreater(boxes, String.valueOf(boxToCompare)));         
       
    }

    public static <T> void SwapElements(List<T> type, int firstIndex, int secondIndex) {
        type.add(type.get(firstIndex));
        type.set(firstIndex, type.get(secondIndex));
        type.set(secondIndex, type.get(type.size() - 1));
        type.remove(type.size() - 1);
    }

    public static <T extends Comparable<T>> int countGreater(List<T> list, T element) {
        int counter= 0;
        for (int i = 0; i < list.size(); i++) {
            if (element.compareTo(list.get(i)) < 0) {
                counter++;
            }
        }
        return counter;
    }
}

 

package genericBox;

public class Box <T extends 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();
    }
}
0
kaloyannikov avatar kaloyannikov 531 Точки

Защо да не му казваш от какви елементи ще е ? Защо тогава типизираш List<String> ? 

Абсолютно същото е , а идеята е тоя бокс да работи с каквито и да е Т елементи които му подадеш . Не е коректно обаче 1 бокс да може да събира всякакви типове в себе си , така ще се счупи логиката , защото как ще comparevash Integer и String?

0
01/08/2016 11:13:50
RoYaL avatar RoYaL Trainer 6849 Точки

List<Box> е ок. Просто като правиш new Box, казвай че ще е от стрингове Box<String> box = new ...

1
mighty_hasu avatar mighty_hasu 1 Точки

Не става и със Box<String>.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.