Java 使用集合进行排序时出现的问题
我正在尝试对列表中的数据进行排序,该列表具有字段id:Java 使用集合进行排序时出现的问题,java,sorting,collections,compare,Java,Sorting,Collections,Compare,我正在尝试对列表中的数据进行排序,该列表具有字段id: field id :field_38637 field id :field_38469 field id :field_38468 field id :field_38638 field id :field_38637 field id :field_38469 field id :field_38468 field id :field_38468 field id :field_38469 field id :field_38468 fi
field id :field_38637
field id :field_38469
field id :field_38468
field id :field_38638
field id :field_38637
field id :field_38469
field id :field_38468
field id :field_38468
field id :field_38469
field id :field_38468
field id :field_38637
列表数据的大小为11,对于上面的列表数据,我正在进行排序,如下所示:
Collections.sort(copedppList, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Field oo1 = (Field ) o1;
Field oo2 = (Field ) o2;
if(oo1.getFieldId()!=oo2.getFieldId()){}
return 1;
else
return 0;
});
for (int i = 0; i < copedppList.size(); i++) {
Field pp = (Field) copedppList
.get(i);
System.out.println(pp.getFieldID());
}
编辑:
排序后,相似的字段id被分组在一起,但它应该按照以386373846938468开头的传入列表进行分组,这里有什么问题?我想保持传入列表的顺序。您没有在比较器中排序,只检查是否相等。这可能会更好:
public int compare(Object o1, Object o2) {
Field oo1 = (Field ) o1;
Field oo2 = (Field ) o2;
return oo1.getFieldID().compareTo(oo2.getFieldID());
}
假定getFieldID是非空字符串
ps:您似乎没有使用泛型,它将使您能够从代码中删除所有这些强制转换
编辑
实际上,您希望对项目进行分组,而不是对其进行排序。最简单的方法是在两个未测试的列表中执行此操作:
public static void main(String[] args) throws InterruptedException {
List<Field> originalList = new ArrayList<Field>();
originalList.add(new Field("field_38637"));
originalList.add(new Field("field_38469"));
originalList.add(new Field("field_38468"));
originalList.add(new Field("field_38638"));
originalList.add(new Field("field_38637"));
originalList.add(new Field("field_38469"));
originalList.add(new Field("field_38468"));
originalList.add(new Field("field_38468"));
originalList.add(new Field("field_38469"));
originalList.add(new Field("field_38468"));
originalList.add(new Field("field_38637"));
System.out.println(originalList);
List<Field> groupedList = new ArrayList<Field>(originalList.size());
while (!originalList.isEmpty()) {
String id = originalList.get(0).getFieldID();
for (Iterator<Field> it = originalList.iterator(); it.hasNext();) {
Field f = it.next();
if (f.getFieldID().equals(id)) {
it.remove();
groupedList.add(f);
}
}
}
System.out.println(groupedList);
}
public static class Field {
private final String fieldID;
public Field(String fieldID) {
this.fieldID = fieldID;
}
public String getFieldID() {
return fieldID;
}
@Override
public String toString() {
return "Field{" + "fieldID=" + fieldID + '}';
}
}
阅读文档以进行比较。根据元素a和b之间的关系,应该返回-1、0或1。您只返回0或1,因此排序将不起作用 试着读一读 试一试
将列表中的所有值放入一个集合中。返回1表示大于。您的代码表明,如果b然后是a>b和b>a,这没有意义。是的,但我需要数据的顺序与传入列表的顺序相同,应该在这个列表中分组386373846938468order@simpy你的清单排序最好——这不是你想要的吗?同样,通过像以前那样改变你的问题,你使所有的答案都变得无关紧要,这使得这整条线索对未来的访问者来说毫无用处。我建议您回滚更改并在原始问题的底部添加一个编辑,解释为什么建议的答案不能解决您的问题。@simpy Ok如果不想对列表排序,您想将类似的项目分组在一起。因此,我认为使用内置的Collections.sort方法没有办法做到这一点。@assylias如何实现这一点?@assylias获取异常数组索引超出了范围
public static void main(String[] args) throws InterruptedException {
List<Field> originalList = new ArrayList<Field>();
originalList.add(new Field("field_38637"));
originalList.add(new Field("field_38469"));
originalList.add(new Field("field_38468"));
originalList.add(new Field("field_38638"));
originalList.add(new Field("field_38637"));
originalList.add(new Field("field_38469"));
originalList.add(new Field("field_38468"));
originalList.add(new Field("field_38468"));
originalList.add(new Field("field_38469"));
originalList.add(new Field("field_38468"));
originalList.add(new Field("field_38637"));
System.out.println(originalList);
List<Field> groupedList = new ArrayList<Field>(originalList.size());
while (!originalList.isEmpty()) {
String id = originalList.get(0).getFieldID();
for (Iterator<Field> it = originalList.iterator(); it.hasNext();) {
Field f = it.next();
if (f.getFieldID().equals(id)) {
it.remove();
groupedList.add(f);
}
}
}
System.out.println(groupedList);
}
public static class Field {
private final String fieldID;
public Field(String fieldID) {
this.fieldID = fieldID;
}
public String getFieldID() {
return fieldID;
}
@Override
public String toString() {
return "Field{" + "fieldID=" + fieldID + '}';
}
}
public int compare(Object o1, Object o2)
{
Field oo1 = (Field ) o1;
Field oo2 = (Field ) o2;
return oo1.getFieldID().compareTo(oo2.getFieldID());
}