Java:使用 Comparator 和 属性 的第二个单词对对象列表进行排序
Java: Sort a list of Objects using Comparator with second word of the property
我有一个 objects
的列表,我想根据 name
对其进行排序。我已经完成了编码,它确实根据 name
进行了排序,但我的要求略有不同。
这些名称是我目前使用以下代码排序的示例:
Bull AMP
Cat DEF
Dog AMP
Frog STR
Zebra DEF
但我希望根据名称中的第二个单词对名称进行排序。基本上 list
应该是这样的:
Bull AMP
Dog AMP
Cat DEF
Zebra DEF
Frog STR
下面是我的代码:
对象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;
}
比较器Class
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);
这个需要自己实现,如下,假设单词是name
的一部分,with substring()
and 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(" ")
));
}
如果出于某种原因你有两个以上的词,而最后一个是你想要的,那么使用 lastIndexOf()
像这样更改比较器:
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 的较新比较器 API:
Comparator<AnimalData> c = Comparator.comparing(animal -> animal.getName().split(" ")[1]);
请注意,这是假设所有名称实际上都有两个词。如果您不确定,则需要在访问拆分数组之前进行检查。
除此之外,您可能需要考虑其他注释并在构造函数中拆分名称并有两个字段,name
和 category
。或者您可以为类别编写一个 getter,在其中进行拆分和验证。
在这里
输出::
[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 + "]";
}
在Java 8 流模式中:
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());
我有一个 objects
的列表,我想根据 name
对其进行排序。我已经完成了编码,它确实根据 name
进行了排序,但我的要求略有不同。
这些名称是我目前使用以下代码排序的示例:
Bull AMP
Cat DEF
Dog AMP
Frog STR
Zebra DEF
但我希望根据名称中的第二个单词对名称进行排序。基本上 list
应该是这样的:
Bull AMP
Dog AMP
Cat DEF
Zebra DEF
Frog STR
下面是我的代码:
对象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;
}
比较器Class
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);
这个需要自己实现,如下,假设单词是name
的一部分,with substring()
and 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(" ")
));
}
如果出于某种原因你有两个以上的词,而最后一个是你想要的,那么使用 lastIndexOf()
像这样更改比较器:
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 的较新比较器 API:
Comparator<AnimalData> c = Comparator.comparing(animal -> animal.getName().split(" ")[1]);
请注意,这是假设所有名称实际上都有两个词。如果您不确定,则需要在访问拆分数组之前进行检查。
除此之外,您可能需要考虑其他注释并在构造函数中拆分名称并有两个字段,name
和 category
。或者您可以为类别编写一个 getter,在其中进行拆分和验证。
在这里
输出::
[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 + "]";
}
在Java 8 流模式中:
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());