简体   繁体   English

Java:使用Comparator将对象列表与属性的第二个单词排序

[英]Java: Sort a list of Objects using Comparator with second word of the property

I have a list of objects which i want to sort on basis of name . 我有一个objects列表,我想根据name排序。 I have done coding where it does get sorted on basis of name but i have a slight different requirement. 我已经完成了编码,它根据name进行排序,但我的要求略有不同。

The names are for Example which i have currently sorted using the below code: 名称是示例,我目前使用以下代码排序:

Bull AMP
Cat DEF
Dog AMP
Frog STR
Zebra DEF

But i want the name sorted on the basis of second word in the name. 但我希望名称按名称中的第二个单词排序。 Basically the list should be something like this: 基本上list应该是这样的:

Bull AMP
Dog AMP
Cat DEF
Zebra DEF
Frog STR

Below is my code: 以下是我的代码:

Object Class: 对象类:

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

Comparator Class 比较类

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

Sorting using Collections 使用集合排序

  private List<AnimalData> AnimalDataList;

  Collections.sort(AnimalDataList, AnimalDataComparer);

Change your Comparator like this: 像这样改变您的比较器:

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

or use Java's newer Comparator API: 或使用Java的新Comparator API:

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

Note that this is assuming that all names actually have two words. 请注意,这假设所有名称实际上都有两个单词。 If you do not know that for sure, you need to check before accessing the split array. 如果您不确定,则需要在访问split数组之前进行检查。

Aside from all that, you might want to think about the other comments and split the name in your constructor and have two fields, name and category . 除此之外,您可能想要考虑其他注释并在构造函数中拆分名称,并有两个字段, namecategory Or you could write a getter for category, in which you do the splitting and validation. 或者你可以为类别编写一个getter,你可以在其中进行拆分和验证。

You need to implement this yourself, as follows, assuming that the word is part of name , with substring() and indexOf() : 你需要自己实现这个,如下所示,假设这个单词是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(" ")
    ));
}

If for some reason you have more than two words and the last is the one you want, then use lastIndexOf() 如果由于某种原因你有两个以上的单词而且最后一个是你想要的单词,那么使用lastIndexOf()

In Java 8 Streams mode: 在Java 8 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());

Here it is 这里是

OUTPUT:: 输出::

[AnimalData [name=Dog AMP], AnimalData [name=Cat DEF], AnimalData [name=Zebra DEF], AnimalData [name=Frog STR]] [AnimalData [name = Dog AMP],AnimalData [name = Cat DEF],AnimalData [name = Zebra DEF],AnimalData [name = Frog STR]]

import java.io.IOException;
import java.io.Serializable;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class test {
    public static void main(String[] args) throws IOException, ParseException {

        AnimalData data1 = new AnimalData("Cat DEF");
        AnimalData data2 = new AnimalData("Dog AMP");
        AnimalData data3 = new AnimalData("Frog STR");
        AnimalData data4 = new AnimalData("Zebra DEF");
        List<AnimalData> list = new ArrayList<>();
        list.add(data1);
        list.add(data2);
        list.add(data3);
        list.add(data4);
        Collections.sort(list);
        System.out.println(list);

    }
}

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

    public AnimalData(String name) {
        super();
        this.name = name;
    }

    @Override
    public int compareTo(AnimalData o) {
        String secondPartThis = this.name.split(" ")[1];
        String secondPartObject = o.name.split(" ")[1];
        return secondPartThis.compareTo(secondPartObject);
    }

    @Override
    public String toString() {
        return "AnimalData [name=" + name + "]";
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 使用Comparator.comparing按对象列表排序对象,然后使用第二个属性 - Using Comparator.comparing for sorting an object by a list of objects and then by a second property 使用比较器对对象列表进行排序 - Using Comparator to sort the List of Objects 如何使用Java中的比较器在列表界面中对语言环境对象列表进行排序 - How to sort list of locale objects in list interface using comparator in java 使用Comparator和Java中的对象列表 - Using Comparator with List of Objects in Java 分组,然后使用Java比较器对列表进行排序 - Group and then sort a list using java comparator 如何在不使用比较器的情况下按在 Java 中遇到 substring 的次数对对象列表进行排序? - How to sort a list of objects by number of times a substring is encountered in Java without using Comparator? 使用Java中的比较器逻辑对对象进行排序 - Sort the Objects with comparator logic in java 使用给定的比较器作为参数对对象列表进行排序的类方法(Java) - Class method that sort a list of objects with a comparator given as parameter (Java) 如何在没有比较器的 java 中使用 MergeSort 对对象数组进行排序 - How to sort an array of objects using MergeSort in java without comparator 带有自定义比较器的Java排序列表 - Java Sort List with custom Comparator
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM