#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> , не знал, что это так. Спасибо!