我终于从java.util.Collections中了解了Comparable的各种可能性;
我可以按照我想要的任何顺序订购一个对象,例如“Beer”,其中包含属性float content,String name和String origin,并将它们组合成我想要的。
现在的问题是: 我有以下类(最后提供的代码):
建筑可以是三种类型之一,例如住宅,房屋,平房。
现在,任务是“对所有建筑物进行排序,首先是城市(升序),然后是街道(升序),然后是街道编号(升序)。
通常情况下,我只是先按城市排序,然后按街道排序,再按数字排序。当然,在第一次排序后,它的解决方案会被以下类型混淆。
这就是为什么我搜索网络并找到可比较的。
事情是:它确实与啤酒示例有关,但没有地址。因为它是作为ArrayList实现的,正如我所发现的,它只适用于Arrays。
但即使这样,地址本身也不是数组,而是对象构建的一部分。
那么在上帝的地球上应该如何解决这个问题呢? 我想我用这个cr * p花了8个多小时,学生们应该在2到3个小时内解决类似的问题。
任何建议都表示赞赏。
谢谢,
理学
import java.util.List;
public abstract class Building {
private Address address;
private List<Owner> owners;
public abstract double getCostRate(double costs);
public void setAddress(Address address) {
this.address = address;
}
public Address getAddress() {
return address;
}
public List<Owner> getOwners() {
return owners;
}
}
班级地址:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import de.uni_mannheim.informatik.swt.pm.extended.ComparatorCityStreetNumber;
public class Address implements Comparable<Address> {
private String street;
private int houseNr;
private int zip;
private String city;
private String country;
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public int getZip() {
return zip;
}
public void setZip(int zip) {
this.zip = zip;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public void setHouseNr(int houseNr) {
this.houseNr = houseNr;
}
public int getHouseNr() {
return houseNr;
}
/**
* eclipse is able to generate the equals method automatically ;)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Address other = (Address) obj;
if (city == null) {
if (other.city != null)
return false;
} else if (!city.equals(other.city))
return false;
if (country == null) {
if (other.country != null)
return false;
} else if (!country.equals(other.country))
return false;
if (houseNr != other.houseNr)
return false;
if (street == null) {
if (other.street != null)
return false;
} else if (!street.equals(other.street))
return false;
if (zip != other.zip)
return false;
return true;
}
比较
public class ComparatorCityStreetNumber implements Comparator<Address> {
public int compare(Address a1, Address a2) {
if (a1.getCity().compareTo(a2.getCity()) == 0) {
if (a1.getStreet().compareTo(a2.getStreet()) == 0) {
if (a1.getHouseNr() > a2.getHouseNr()) {
return -1;
} else {
return a1.getStreet().compareTo(a2.getStreet());
}
} else if (a1.getCity().compareTo(a2.getCity()) > 0) {
return -1;
} else {
return 1;
}
}
return 0;
}
}
答案 0 :(得分:0)
您只需要实现compareTo(...)
方法,并且您应该在其中放置地址比较逻辑,当您为Collections.sort(...)
对象调用List<Address>
方法时将使用该逻辑。
示例:
List<Address> l = new ArrayList<Address>();
// ... fill values in the list
Collections.sort(l);
这将使用Address类中compareTo(...)方法的逻辑。例如:
int compareTo(Address o) {
return o.getCity().compareTo(this.getCity());
}
因此,这将使用compareTo(...)方法的String实现来按城市对地址进行排序。通过这种方式,您不需要使用ComparatorCityStreetNumber类,也不需要使用任何其他Comparator类。
了解更多信息: http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html#compareTo(T)
编辑:
如果您的compareTo(...)方法不起作用,您可以始终将此逻辑放在compare(Address a1, Address a2)
类的ComparatorCityStreetNumber
方法中。
然后你不需要在你的Address类中实现Comparable,也不需要在那里实现compareTo(...)方法。
然后你的排序电话会是:
List<Address> l = new ArrayList<Address>();
// fill in the list with addresses
ComparatorCityStreetNumber c = new ComparatorCityStreetNumber();
Collections.sort(l, c);
因此,如果您遇到其他问题,请尝试使用新输出编辑问题。
有关详情:http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html#compare(T,T)
答案 1 :(得分:0)
看起来您的Building是一个抽象类,它会提示您必须扩展它。
鉴于这是一项任务,我不打算为你做。相反,我会给你一些指示: - )
创建一个扩展Building的Property对象,并实现getCostRate方法,该方法现在返回零。要么那么,要么建筑具体......我的猜测是建筑的子类尚未到来,所以如果是这样的话,请抓住这个想法。
现在创建Comparator对象的PropertyComparator实现。
现在,从能够确定排序条件的角度来看,您应该能够编写简单的逻辑来将一个Property与另一个Property及其相应的Addresses进行比较 - 如果您想获取黄金,请创建一个AddressComparator也 - 让你的BuildingComparator调用AddressComparator来比较地址。
最后,如果您有一组Property对象,请将它们放入TreeSet中,但使用PropertyComparator构造TreeSet。
一旦它在TreeSet中,它将根据您的实现进行排序。
祝你好运!答案 2 :(得分:0)
我发现了我的错误,这是在最后的方面。 IF不得为this.getCity().compareTo(address.getCity()) = 0
,但必须为this.getCity().compareTo(address.getCity()) > 0
因此,按照我的标准排序的整个代码如下所示:
public int compareTo(Address address) {
if (this.getCity().compareTo(address.getCity()) == 0) {
if (this.getStreet().compareTo(address.getStreet()) == 0) {
if (this.getHouseNr() > address.getHouseNr()) {
return 1;
} else {
return -1;
} // end house number
} else {
return this.getStreet().compareTo(address.getStreet());
} //end street
} else if (this.getCity().compareTo(address.getCity()) > 0) {
return 1;
} else {
return -1;
} //end city
}