首页 > 解决方案 > 比较向量中的两个对象字符串

问题描述

我必须编写我自己的compareTo()-Method 来为 Objects 命名的词法顺序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并对其进行排序。它仅针对前两个元素执行此操作,仅此而已。

任何人都可以帮忙吗?或者告诉我,我的错误在哪里?

标签: java

解决方案


你的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);
}

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

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);

推荐阅读