Java Collections.sort与listview和adapter一起无法正常工作
Java Collections.sort与listview和adapter一起无法正常工作,java,android,Java,Android,Collections.sort()未按预期工作。当我将Collections.reverse()放在Collections.sort()之前时,ArrayList的顺序是不同的。这怎么可能?这是相同的数据,刚刚恢复 messages = new ArrayList<Message>(); messageDatabase.getConditionBuilder().setSortOrder(DatabaseHelper.KEY_MESSAGE_TIME + " DES
Collections.sort()
未按预期工作。当我将Collections.reverse()
放在Collections.sort()之前时,ArrayList
的顺序是不同的。这怎么可能?这是相同的数据,刚刚恢复
messages = new ArrayList<Message>();
messageDatabase.getConditionBuilder().setSortOrder(DatabaseHelper.KEY_MESSAGE_TIME + " DESC");
messageDatabase.getConditionBuilder().setSqlLimit(100);
messages.addAll(messageDatabase.getList());
// different results if I remove the reverse line
Collections.reverse(messages);
Collections.sort(messages);
messageAdapter = new MessageAdapter(this, R.layout.list_message_item, messages);
messageAdapter.setIsPrivateChat(true);
listView.setAdapter(messageAdapter);
更新:
我对代码进行了一些更新,并添加了调试。现在按localTime排序,这是unix时间戳(以微秒为单位)。没有相等的时间戳
@Override
public int compareTo(Message another) {
return Float.compare(localTime, another.getLocalTime());
}
从数据库中读取:
messages = new ArrayList<Message>();
messageDatabase.getConditionBuilder().setSortOrder(DatabaseHelper.KEY_MESSAGE_LOCAL_TIME + " DESC");
messageDatabase.getConditionBuilder().setSqlLimit(100);
messages.addAll(messageDatabase.getList());
for (Message m : messages) {
Log.i("debug", "time unsorted: " + m.getLocalTime());
}
Collections.sort(messages);
for (Message m : messages) {
Log.i("debug", "time: " + m.getLocalTime());
}
但实际上,我希望排序后的数组如下所示:
06-21 15:56:14.734: I/debug(13886): time: 3338244
06-21 15:56:14.734: I/debug(13886): time: 3338339
06-21 15:56:14.734: I/debug(13886): time: 3338375
06-21 15:56:14.734: I/debug(13886): time: 3338415
06-21 15:56:14.734: I/debug(13886): time: 3338455
06-21 15:56:14.734: I/debug(13886): time: 3338481
06-21 15:56:14.734: I/debug(13886): time: 3338514
06-21 15:56:14.734: I/debug(13886): time: 3338542
06-21 15:56:14.734: I/debug(13886): time: 3372601
06-21 15:56:14.734: I/debug(13886): time: 4591162
06-21 15:56:14.734: I/debug(13886): time: 4607303
06-21 15:56:14.734: I/debug(13886): time: 4607969
我是否误读了集合.sort()
?Long。比较(Long,Long)
应用于比较长值
考虑下面的项集合A-F,每个项都有一个整数属性size Collections.reverse()可以执行以下操作:
F(2)
E(5)
D(4)
C(2)
B(1)
A(1)
然后Collections.sort()将根据大小对项目进行重新排序,但在其他情况下,排序将保持不变:
E(5)
D(4)
F(2)
C(2)
B(1)
A(1)
这样,如果只执行Collections.sort()而不首先反转集合,A&B和C&F将保持相同的顺序:
E(5)
D(4)
C(2)
F(2)
A(1)
B(1)
Long。比较(Long,Long)
应用于比较长值
考虑下面的项集合A-F,每个项都有一个整数属性size Collections.reverse()可以执行以下操作:
F(2)
E(5)
D(4)
C(2)
B(1)
A(1)
然后Collections.sort()将根据大小对项目进行重新排序,但在其他情况下,排序将保持不变:
E(5)
D(4)
F(2)
C(2)
B(1)
A(1)
这样,如果只执行Collections.sort()而不首先反转集合,A&B和C&F将保持相同的顺序:
E(5)
D(4)
C(2)
F(2)
A(1)
B(1)
Collections.sort
使用stable排序算法(修改的合并排序),也就是说,如果某些项具有相等的键,则在对集合进行排序时,它们的相互顺序在排序后将保持不变
这就是为什么在排序后反转集合会更改排序。当然,只有具有相同排序键的项才会具有不同的顺序。
集合。排序
使用稳定的排序算法(修改的合并排序),也就是说,如果某些项具有相同的键对集合进行排序,则排序后它们的相互顺序将保持不变
这就是为什么在排序后反转集合会更改排序。当然,只有具有相同排序键的项才会具有不同的顺序。某些消息是否包含相同的时间?是否应该使用
Long.compare()
来比较两个时间戳?当然,Argh…现在似乎可以工作了!请将此添加到您的答案中,以便我可以接受更新。某些消息是否包含相同的时间?您是否应该使用Long.compare()
来比较两个时间戳?啊,当然……现在似乎可以了!请将此添加到您的答案中,以便我可以接受它作为我的更新。Long.compare()
需要API 19。所以我可以很好地检查a>b并返回1还是-1?如果您点击,您将看到它是一个单行静态函数:returnlhsLong.compare()
需要API 19。所以我可以很好地检查a>b并返回1还是-1?如果您点击,您将看到它是一个单行静态函数:returnlhs