Проблема с коллекцией Java

#java #collections #linked-list

#java #Коллекции #связанный список

Вопрос:

Хорошо, итак, у меня намечается небольшой лабораторный тест, и тема для меня довольно сложная. Мне удалось получить пример subject от кого-то, кто уже использовал его, но у меня возникли проблемы с его решением. Тема находится в следующем:

Создайте класс Apartment (int nr, строковая ориентация) и создайте класс LuxuryApartment, который наследуется от класса Apartment, а также имеет атрибут surface типа Float .

Я думаю, это довольно просто, здесь проблем нет.

Создайте класс MyLinkedList, который расширяет класс LinkedList, чтобы вы могли хранить в нем объекты типа Apartment. Добавьте метод, называемый sortByOrientation(), который будет сортировать ячейки в алфавитном порядке по их ориентации, используя компаратор, определенный как обычный внутренний класс.

Вот где у меня возникли небольшие проблемы. Я могу создать свой класс MyLinkedList, но я не понимаю, как должен выглядеть метод sortByOrientation().

Создайте тестовую программу, которая инициализирует MyLinkedList. Добавьте 3 квартиры и 3 роскошных апартамента. Распечатайте список, отсортируйте список с помощью метода sortByOrientation() и распечатайте список с помощью итератора.

Как я могу добавить LuxuryApartments в MyLinkedList, если ранее они сказали, что я должен создать класс, чтобы я мог хранить только апартаменты?

Переместите апартаменты, которые не являются роскошными, в LinkedList, а роскошные — в LinkedList. Создайте метод, в котором перечислены апартаменты и апартаменты класса люкс.

Я думаю, это не сложно, но что они подразумевают под перемещением? Беру ли я свои квартиры из вышеупомянутого MyLinkedList?

Может кто-нибудь дать мне несколько советов по этому упражнению? Я действительно потерялся здесь. Извините, если мой вопрос глупый / не соответствует рекомендациям / и т.д. Но у меня действительно нет идей о том, как выполнить это упражнение.

Класс Apartment — я не уверен, нужно ли ему реализовывать сопоставимый интерфейс, как я уже сказал, на данный момент я довольно плохо разбираюсь в Java

 public class Apartament implements Comparable<Apartament>{
    private int nr;
    private String orientare;
    public int getNr() {
        return nr;
    }
    public void setNr(int nr) {
        this.nr = nr;
    }
    public String getOrientare() {
        return orientare;
    }
    public void setOrientare(String orientare) {
        this.orientare = orientare;
    }

    public Apartament(int nr, String orientare){
        this.nr=nr;
        this.orientare=orientare;
    }
    public int compareTo(Apartament ap){
        return ap.orientare.compareTo(this.orientare);
    }
}
  

Мой класс LuxuryApartment, который наследуется от моего класса Apartment

 public class ApartamentLux extends Apartament{
    private float suprafata;

    public float getSuprafata() {
        return suprafata;
    }

    public void setSuprafata(float suprafata) {
        this.suprafata = suprafata;
    }

    public ApartamentLux(int n, String o, float suprafata){
        super(n,o);
        this.suprafata=suprafata;
    }
}
  

Вот где я действительно потерялся, кажется, не могу заставить это работать.

 import java.text.Collator;
import java.util.Comparator;
import java.util.LinkedList;

public class MyLinkedList extends LinkedList<Apartament>{
    public MyLinkedList(){
        super();
    }
    private static class OrComp implements Comparator<String>{
        public int compare(String s1, String s2){
            if(s1.compareTo(s2)<0)
                return 1;
            else return 0;
        }


    public void sortByOrientare(OrComp list){
        list.sort(new Comparator<String>(){
            @Override
            public int compare(String s1, String s2){
                return Collator.getInstance().compare(s1, s2);
            }
        });

        }
    }
}
}
  

Комментарии:

1. @nhouser9 это не домашнее задание, я собираюсь добавить свою неудачную попытку решить ее сейчас, хотя

2. Что касается пункта 3. Если вы понимаете наследование, то роскошная квартира — это тип квартиры. Ваш список может содержать квартиру и любую вещь, которая выходит за пределы квартиры.

3. это может просветить вас docs.oracle.com/javase/tutorial/java/IandI/subclasses.html также

4. OrComp является избыточным и неполным. Метод sortByOrientare не должен принимать параметр и должен просто вызывать this.sort() с Comparator<Apartment> , который сравнивает a.getOrientare() с b.getOrientare()

Ответ №1:

Для вашего класса list вы должны сортировать список ( this ) из метода. Вы создали дополнительный компаратор<String>, который возвращает 0, когда он должен возвращать -1, и попытались отсортировать это.

Вам не нужно реализовывать сопоставимый интерфейс, поскольку вы делаете это таким образом, и в любом случае я считаю, что вам следует использовать this.orientare.compareTo(other.orientare), а не наоборот.

Но используя пользовательский метод и компаратор, которые, похоже, являются тем, о чем просит упражнение, вот более простой способ заставить это работать.

 import java.text.Collator;
import java.util.Comparator;
import java.util.LinkedList;

public class MyLinkedList extends LinkedList<Apartament> {
    public void sortByOrientare(){
        sort(new MyComparator());
    }
    class MyComparator extends Comparator<Apartament> {
        @Override
        public int compare(Apartament s1, Apartament s2){
            return Collator.getInstance().compare(s1.getOrientare(), s2.getOrientare());
        }
    }
}
  

Поскольку ApartamentLux расширяет Apartament, его экземпляры могут быть добавлены в ваш пользовательский список. (Поскольку они также являются экземплярами Apartament)

Похоже, что вы разобрались со всем остальным, кроме разделения списка. Я предполагаю здесь, но я представляю, чего они хотят, это что-то вроде этого:

 LinkedList<Apartament> list1 = new LinkedList<>();
LinkedList<Apartament> list2 = new LinkedList<>();
for(Apartament a : myList) {
    if(a instanceof ApartamentLux) {
        list2.add(a);
    } else {
        list1.add(a);
    }
}
  

С последующим распечатыванием списка.

Комментарии:

1. О, большое вам спасибо, мне действительно нужно продолжить изучение и догнать Java. Однако один вопрос, что они имеют в виду, когда говорят, что мой метод sortByOrientare должен «использовать компаратор, определенный как обычный внутренний класс»?

2. О, я не видел этого требования. Я обновлю свой ответ.

3. Я не совсем уверен, что они подразумевают под «обычным» внутренним классом, мое лучшее предположение — «не статичный».

Ответ №2:

Как я могу добавить LuxuryApartments в MyLinkedList, если ранее они сказали, что я должен создать класс, чтобы я мог хранить только апартаменты?

Поскольку MyLinkedListtype может хранить тип Apartment, он также может хранить LuxuryApartments, поскольку это дочерний класс.

Комментарии:

1. О, сначала я думал, что должен использовать LinkedList<Object> , не знал, что это так. Спасибо!