当前位置: 首页 > 知识库问答 >
问题:

Java:使用Comparator和属性的第二个字对对象列表进行排序

萧宣
2023-03-14

我有一个对象列表,我想根据名称进行排序。我已经完成了编码,它确实会根据名称进行排序,但我有一个稍微不同的要求。

例如,我目前使用以下代码对这些名称进行了排序:

Bull AMP
Cat DEF
Dog AMP
Frog STR
Zebra DEF

但我想根据名字中的第二个单词来排序。基本上,列表应该是这样的:

Bull AMP
Dog AMP
Cat DEF
Zebra DEF
Frog STR

下面是我的代码

对象类:

public class AnimalData implements Serializable
{
    private static final long serialVersionUID = 3952396152688462601L;
    public String name;
    public long age;
    private String animal;
    private String animalParts;
    private String animalType;
}

比较器类

public class AnimalDataComparer implements Comparator<AnimalData> 
      {
  @Override
  public int compare(final AnimalData object1, final AnimalData object2) 
  {
          return object1.getName().compareTo(object2.getName());
  }
  }

使用集合排序

  private List<AnimalData> AnimalDataList;

  Collections.sort(AnimalDataList, AnimalDataComparer);

共有3个答案

漆雕安晏
2023-03-14

在Java8 Streams模式下:

Comparator<? super Animal> animalComparator = (a, b) -> {
        StringTokenizer firstTokenizer = new StringTokenizer(a.getName(), " ");
        firstTokenizer.nextToken();
        StringTokenizer secondTokenizer = new StringTokenizer(b.getName(), " ");
        secondTokenizer.nextToken();
        return firstTokenizer.nextToken().compareTo(secondTokenizer.nextToken());
    };

    myList = myList.stream().sorted(animalComparator).collect(Collectors.toList());
顾俊誉
2023-03-14

您需要自己实现这一点,如下所示,假设该词是name的一部分,带有substring()indexOf()

@Override
public int compare(final AnimalData object1, final AnimalData object2) 
{
    return object1.getName().substring(
        object1.getName().indexOf(" ") 
    ).compareTo(object2.getName().substring(
        object2.getName().indexOf(" ")
    ));
}

如果出于某种原因,您有两个以上的单词,而最后一个是您想要的,那么请使用

裴学
2023-03-14

像这样更改您的比较器:

public class AnimalDataComparer implements Comparator<AnimalData> 
{
    @Override
    public int compare(final AnimalData object1, final AnimalData object2) 
    {
      return object1.getName().split(" ")[1].compareTo(object2.getName().split(" ")[1]);
    }
}

或者使用Java较新的Comparator API:

Comparator<AnimalData> c = Comparator.comparing(animal -> animal.getName().split(" ")[1]);

请注意,这是假设所有名称实际上都有两个单词。如果您不确定这一点,则需要在访问拆分阵列之前进行检查。

除此之外,您可能需要考虑其他注释,并在构造函数中拆分名称,并有两个字段,名称和类别。或者您可以为category编写一个getter,在其中进行拆分和验证。

 类似资料:
  • 我试图排序基于一个nullable ArrayList在java 8列表。 列表如下 我正在尝试使用streams sort根据患者就诊日期(就诊列表中的第一个元素)的降序对患者对象进行排序。空值应该放在最后。最终结果必须是 我尝试过以下方法,但即使在空检查之后,也会出现空指针异常。

  • 问题内容: 我想按对象的指定属性对对象列表进行排序,并希望选择用于排序的属性。例: 这个想法很简单: 我将要排序的所有值都放入一个数组中,并创建了一个映射,将这些值映射回它们的对象。对这个数组进行排序后,我将映射到这些值的对象按相同的顺序放入一个新数组中,然后按这些值对它们进行排序。这些值只是使用Object类型创建的,因此我可以按多种类型(不仅仅是示例中的Strings)进行排序。 除非您有两个

  • 问题内容: 和骗局。如何按升序排序,然后按?有人可以帮忙吗?我知道在中具有通用算法和重载运算符,但是我是Java新手。 问题答案: 使实现或在单独的类中实现。然后致电: 要么 通常,如果有一个单一的“自然”排序顺序,则实施是个好主意…否则(如果你碰巧想要按特定顺序进行排序,但可能同样容易地希望使用另一个顺序),则最好实现。老实说,这种特殊情况可能会发生任何一种……但是我可能会坚持使用更灵活的选择。

  • 问题内容: 我有一个Java对象列表,希望根据多个字段进行排序。 是否可以使用或接口根据多个字段对列表进行排序?我看到的所有示例仅根据一个领域进行排序。换句话说,可以按“校园”或“教师”或“建筑”进行排序。我想按“校园”,“教师”,“建筑”(因为它在SQL中存在)进行排序 问题答案: 您的比较器如下所示: 基本上,只要到目前为止已比较的属性相等(),它就会继续比较类的每个连续属性。

  • 问题内容: 比方说你有一个的对象。 如果它们都具有int GoalScored变量,则如何排序?你如何按GoalScored排序? 问题答案: 你可以使用Collections.sort自定义Comparator 。 比较部分也可以这样写: 或者,你可以制作。这定义了所有对象的自然顺序。使用a 更灵活,因为不同的实现可以按名称,年龄等进行排序。

  • 如何按照一个属性的字母顺序(不是名称,而是属性所包含的实际值)对一个对象列表进行排序?