【问题标题】:Java Collection IssueJava 集合问题
【发布时间】:2016-10-20 21:23:17
【问题描述】:

好的,所以我即将进行一项小型实验室测试,这个主题对我来说非常难。我设法从已经接受过它的人那里获得了一个示例主题,但我在解决它时遇到了问题。题目如下:

创建类 Apartment(int nr, Stringorientation) 并拥有一个继承自类 Apartment 的 LuxuryApartment 类,并且还有一个 Float 类型的属性表面。

我想这很简单,这里没有问题。

创建扩展类 LinkedList 的 MyLinkedList 类,以便您可以在其中存储 Apartment 类型的对象。添加一个名为 sortByOrientation() 的方法,该方法将使用定义为普通内部类的比较器按公寓的方向按字母顺序对公寓进行排序。

这是我遇到一些麻烦的地方。我可以创建我的 MyLinkedList 类,但我不明白 sortByOrientation() 方法应该是什么样子。

创建一个初始化 MyLinkedList 的测试程序。添加 3 套公寓和 3 套 LuxuryApartments。打印列表,使用 sortByOrientation() 方法对列表进行排序,然后使用迭代器打印列表。

如果他们之前说我应该上课以便我只能存储公寓,我该如何将 LuxuryApartments 添加到 MyLinkedList?

将不豪华的公寓移动到链接列表中,将豪华公寓移动到链接列表中。创建一个列出公寓和豪华公寓的方法。

我想这并不难,但他们所说的移动是什么意思?我是否从上述 MyLinkedList 中获取我的公寓?

有人可以给我一些关于这个练习的建议吗?我真的迷路了。对不起,如果我的问题是愚蠢的/不尊重准则/等。但我真的不知道如何进行这个练习。

Apartment 类 - 我不确定它是否需要实现 Comparable 接口,正如我所说,我现在对 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);
            }
        });

        }
    }
}
}

【问题讨论】:

  • @nhouser9 这不是家庭作业,不过我要补充一下我现在解决它的糟糕尝试
  • 关于第3点。如果您了解继承,那么LuxuryApartment就是一种Apartment。您的列表可以包含一个公寓和任何从公寓延伸出来的东西。
  • OrComp 是多余且不完整的。 sortByOrientare 方法不应接受参数,而应简单地使用 Comparator&lt;Apartment&gt; 调用 this.sort(),将 a.getOrientare()b.getOrientare() 进行比较

标签: java collections linked-list


【解决方案1】:

对于您的列表类,您应该从方法中对列表 (this) 进行排序。您创建了一个额外的 Comparator,它在应该返回 -1 时返回 0,并尝试对其进行排序。

您不需要实现 Comparable 接口,因为您正在这样做,无论如何我相信您应该使用 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);
    }
}

然后打印出列表。

【讨论】:

  • 哦,非常感谢,我真的需要学习并赶上Java。但是有一个问题,当他们说我的 sortByOrientare 方法应该“使用定义为普通内部类的比较器”时,他们是什么意思?
  • 哦,我没有看到这个要求。我会更新我的答案。
  • 我不完全确定他们所说的“正常”内部类是什么意思,我最好的猜测是“不是静态的”。
【解决方案2】:

如果他们之前说我应该上课以便我只能存储公寓,我该如何将 LuxuryApartments 添加到 MyLinkedList?

由于 MyLinkedListtype 可以存储 Apartment 类型,它也可以存储 LuxuryApartments,因为它是一个子类。

【讨论】:

  • 哦,一开始我以为我必须使用LinkedList,不知道是这样的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多