[英]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
. 除此之外,您可能想要考虑其他注释并在构造函数中拆分名称,并有两个字段,
name
和category
。 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.