【发布时间】:2014-10-09 18:14:22
【问题描述】:
我有一个类Woning(房子)和一个子类KoopWoning(可购买的房子)和一个子类HuurWoning(可出租的房子)。 KoopWoning 和 Huurwoning 扩展了 Woning。 HuurWoning 只是一个 Woning,而 KoopWoning 有一个额外的可变能级。 KoopWoning 还有一个函数 getEnergylevel,它返回 KoopWoning 的能级。我还有一个 Portefeuille 类,它有一个 Woningen 的数组列表。
我正在从文本文件中读取 Portefeuille 中的所有 Woningen。在第 5 节课中,我希望能够对 Portefeuille 的 Woningen 的 ArrayList 进行排序(来自文本文件)。我有一个函数 woningenTot(int maxprijs) 返回一个 ArrayList,其中包含满足要求的所有 Woningen(价格低于 maxprijs)。我想在屏幕上打印这些沃宁根。
问题如下: 文件中可能还有一个 KoopWoning。在那种情况下,我还希望能够按能级排序。但是,我无法按能级排序。我不能调用函数getEnergylevel,因为它是一个ArrayList,而Woning不包含函数getEnergylevel。
那么我该如何解决呢?如果太模糊,我可以包含代码,但是它很大:O
感谢任何帮助;我在这个程序上花了几个小时,其中至少有 1.5 小时在这个问题上:(
编辑:这是 KoopWoning 类的代码
public class KoopWoning extends Woning implements EnergiepeilWoning {
private char energiepeil;
public KoopWoning (Adres adres, int kamers, int vraagPrijs, char energiepeil) {
super(adres, kamers, vraagPrijs);
this.energiepeil = energiepeil;
}
public char getEnergiepeil () {
return energiepeil;
}
public boolean compareEnergiepeil (Object other) {
boolean res = false;
if (other instanceof KoopWoning) {
KoopWoning that = (KoopWoning) other;
res = (this.getEnergiepeil() == that.getEnergiepeil());
}
return res;
}
public String toString () {
String res = adres + ", " + kamers + " kamers, prijs " + prijs + ", energiepeil " + energiepeil;
return res;
}
这是Woning类的代码
public class Woning {
protected int kamers;
protected int prijs;
protected Adres adres;
protected String tag;
public Woning (Adres adres, int kamers, int prijs) {
this.adres = adres;
this.kamers = kamers;
this.prijs = prijs;
}
public String toString () {
String res = adres + ", " + kamers + " kamers, prijs " + prijs;
return res;
}
public void setTag (String tag) {
this.tag = tag;
}
public String getTag () {
return tag;
}
public boolean kostHooguit (int maxprijs) {
return (prijs <= maxprijs);
}
public boolean equals (Object other) {
boolean res = false;
if (other instanceof Woning) {
Woning that = (Woning) other;
if (this.adres.equals(that.adres))
res = true;
}
return res;
}
public static Woning read (Scanner sc) {
try {
Adres adress = Adres.read(sc);
int kamer = sc.nextInt();
sc.next();
sc.next();
int prijs = sc.nextInt();
String check = sc.next();
if (check.equals("energiepeil")) {
char peil = sc.next().charAt(0);
KoopWoning kwoning = new KoopWoning (adress, kamer, prijs, peil);
return kwoning;
}
else {
Woning woning = new Woning (adress, kamer, prijs);
return woning;
}
}
catch (Exception e) {
System.out.println("Woning: Exception is caught");
System.out.println(e.getMessage());
Adres adress = new Adres ("", "", "", "");
Woning woning = new Woning (adress, 0, 0);
return woning;
}
}
}
最后,Portefeuille 类的代码
public class Portefeuille {
private ArrayList<Woning> woninglijst;
public Portefeuille () {
woninglijst = new ArrayList<Woning>();
}
public void voegToe (Woning woning) {
if (!woninglijst.contains(woning))
woninglijst.add(woning);
}
public ArrayList<Woning> woningenTot (int maxprijs) {
ArrayList<Woning> woninglijst2 = new ArrayList<Woning>();
for (int i = 0; i < woninglijst.size(); i++) {
if(woninglijst.get(i).kostHooguit(maxprijs))
woninglijst2.add(woninglijst.get(i));
}
return woninglijst2;
}
public String toStringExt () {
String res = "[";
for (int i = 0; i < woninglijst.size(); i++)
res = res + woninglijst.get(i).toString() + "; ";
if (woninglijst.size() != 0)
res = res.substring (0, res.length() - 2);
res = res + "]";
return res;
}
public String toString () {
String res = "";
for (int i = 0; i < woninglijst.size(); i++)
res = woninglijst.get(i).toString2();
return res;
}
public boolean equals (Object other) {
boolean res = false;
if (other instanceof Portefeuille) {
Portefeuille that = (Portefeuille) other;
if (this.woninglijst.size() == that.woninglijst.size()) {
int i = 0;
while (i < this.woninglijst.size() && this.woninglijst.get(i).equals(that.woninglijst.get(i)))
i = i + 1;
res = (i == this.woninglijst.size());
}
}
return res;
}
public static Portefeuille read (String infile) {
try {
Scanner sc = new Scanner (new File(infile));
ArrayList<Woning> wlijst = new ArrayList<Woning>();
Portefeuille p = new Portefeuille();
int woningen = sc.nextInt();
int i = 0;
while (i < woningen) {
sc.nextLine();
String tag = sc.nextLine();
wlijst.add(Woning.read(sc));
p.voegToe(wlijst.get(i));
i++;
}
sc.close();
return p;
}
catch (Exception e) {
System.out.println("Portefeuille: Exception is caught");
Portefeuille p = new Portefeuille();
return p;
}
}
}
编辑
我自己修好了。谢谢大家的回答:)
【问题讨论】:
-
你想如何对没有能量水平的东西进行排序?如果你想对整个批次进行排序,那么你需要决定没有能量级别的项目去哪里。
-
你需要包含代码的relevant部分,听起来它不应该那么大。既然您已经描述了层次结构,那么仅尝试排序和列表的定义就足够了。
标签: java inheritance arraylist