实施例: 原始清单 click here to check original data
staff_id staff_name position_id日期 1 Ada 5 201711 2 Anna 5 2017年11月 3杰克6 201711 1 Ada 6 201712 2 Anna 6 2017年12月 1 Ada 7 201801
排序后:click here to check sorted data
staff_id staff_name position_id日期
3 Jack 6 2017年11月
2 Anna 6 2017年12月
2 Anna 5 2017年11月
1 Ada 7 201801
1 Ada 6 201712
1 Ada 5 201711
这些数据是关于员工的晋升/降级记录。对于员工“杰克”,他的位置没有改变,而阿达晋升3次。
排序规则是:如果staff_id是唯一的(位置没有改变),我们不关心它的顺序。我们需要排序的是有几个记录的员工(staff_id不是唯一的)。日期最大的记录是稳定的根据此记录,相同员工的其他记录应按日期降序排序。例如,Ada促销信息中的最大日期是201801,因此我们不会更改最大日期的订单(相对于其他员工)然后第二大日期是2017年12月,我们把它放在“201801”旁边。
List<Object[]> resultListOrder=...
for(Object[] rowOrder:resultListOrder)
{
for(Object[] row:resultListOrder)
{
if((int)rowOrder[0] ==(int) row[0]&&(int)rowOrder[4]>(int)row[4])
{
Object[] tempRow = row;
resultListOrder.remove(resultListOrder.indexOf(row));
resultListOrder.add(resultListOrder.indexOf(rowOrder)+1,tempRow);
}
}
}
此代码在逻辑上是正确的,但它抛出ConcurrentModificationException.And似乎Iterator在这里不起作用。 然后我用
resultListOrder.sort((m1, m2) -> {
if((int)m1[0] ==(int) m2[0]){
return (int)m1[4]>(int)m2[4] ? -1 : 1;
}
else return 0;
});
但它不起作用,那么如何对列表进行排序?
答案 0 :(得分:0)
使用简单的for循环重写您的第一次尝试:
for(int i = 0; i < resultListOrder.size(); i++) {
for(int j = 0; j < resultListOrder.size(); j++) {
if((int)resultListOrder.get(i)[0] ==(int) resultListOrder.get(j)[0]&&(int)resultListOrder.get(i)[4]>(int)resultListOrder.get(j)[4]) {
Object[] tempRow = resultListOrder.get(j);
resultListOrder.remove(j);
resultListOrder.add(i+1,tempRow);
}
}
}
但是,如果你的算法是正确的,我有很强烈的怀疑。