比较向量中的两个对象字符串

时间:2019-03-13 17:41:47

标签: java

我必须编写自己的compareTo()-方法来为称为Beer的对象按词法排序,该方法将Beer按啤酒类型和啤酒名称进行比较。

这是我的compareTo方法:

@Override
public int compareTo(Beer b) {
    String compareBeer1 = this.getBeerType() + this.getbName();
    String compareBeer2 = b.getBeerType() + b.getbName();
    for(int i = 0; i < compareBeer1.length(); i++) {
        if(compareBeer1.charAt(i) > compareBeer2.charAt(i)) {
            return compareBeer1.charAt(i) - compareBeer2.charAt(i);
        } else if(compareBeer1.equals(compareBeer2)) {
            return 0;
        } else if((compareBeer1.charAt(i) == compareBeer2.charAt(i)) && (compareBeer1.length() - compareBeer2.length()) > 0){
            return compareBeer1.length() - compareBeer2.length();
        }
    }
    return -1;
}

到目前为止,到目前为止,我的问题是我有一个Vector<Beer> filteredBeer,我也必须按词法顺序对其进行排序。因此,我的代码是:

Collections.sort(filteredBeer, new Comparator<Beer>() {
        public int compare(Beer beer1, Beer beer2) {
            return beer1.compareTo(beer2);
        }
    });

不过,我没有得到想要的结果,它没有对整个Vector进行比较和排序。它仅对前两个元素执行操作,仅此而已。

有人可以帮忙吗?还是告诉我,我的错误在哪里?

2 个答案:

答案 0 :(得分:1)

您的compareTo方法很奇怪。 您只需要这个

@Override
public int compareTo(final Beer b) {
    final var compareBeer1 = getBeerType().trim() + getName().trim();
    final var compareBeer2 = b.getBeerType().trim() + b.getName().trim();
    return compareBeer1.compareTo(compareBeer2);
}

请注意,可以对null检查和其他好东西进行增强。
您的啤酒将按类型和名称按字母升序排列。
经过测试

final List<Beer> beers = new ArrayList<>();
beers.add(new Beer("tre", "nome2"));
beers.add(new Beer("due", "snome2"));
beers.add(new Beer("uno", "nome1"));
beers.add(new Beer("uno", "nome5"));
beers.add(new Beer("uno", "nome4"));
beers.add(new Beer("uno", "nome2"));
beers.add(new Beer("due", "nome1"));

Collections.sort(beers, Beer::compareTo);

答案 1 :(得分:0)

compareTo取决于Beer的equals()方法。 看起来Beer的equals()方法没有正确重写(或根本没有重写?),在这种情况下,它依赖于Object的实现...