我正在尝试从列表中对数据进行排序,该列表的字段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
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());
}
排序后我得到了列表
field_38468
field_38468
field_38468
field_38468
field_38468
field_38469
field_38469
field_38469
field_38637
field_38637
field_38637
编辑: 类似的字段ID在排序后被组合在一起,但它应按照以38637,38469,38468开头的输入列表进行分组,这里有什么问题?我想保持传入列表的顺序。
答案 0 :(得分:7)
您没有在比较器中进行排序,只检查相等性。这可能会更好:
public int compare(Object o1, Object o2) {
Field oo1 = (Field ) o1;
Field oo2 = (Field ) o2;
return oo1.getFieldID().compareTo(oo2.getFieldID());
}
(假设getFieldID是非空字符串)
ps:您似乎没有使用泛型,它可以让您从代码中删除所有这些强制转换。
修改强>
您实际上想要对项目进行分组,而不是对它们进行排序。最简单的方法是使用2个列表(未测试):
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 + '}';
}
}
答案 1 :(得分:2)
阅读compare()
的文档。您应该返回-1,0或1,具体取决于元素a
和b
之间的关系。您只返回0或1,因此排序将不起作用。
尝试阅读http://www.javapractices.com/topic/TopicAction.do?Id=10和http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html
尝试
public int compare(Object o1, Object o2)
{
Field oo1 = (Field ) o1;
Field oo2 = (Field ) o2;
return oo1.getFieldID().compareTo(oo2.getFieldID());
}