如何相应地对以下对象进行排序? (Array,ArrayList,Comparable)

时间:2014-04-01 21:38:50

标签: arrays sorting arraylist comparator

我终于从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;
}
 }

3 个答案:

答案 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
}