Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Collections.sort与listview和adapter一起无法正常工作_Java_Android - Fatal编程技术网

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?如果您点击,您将看到它是一个单行静态函数:
returnlhs
Long.compare()
需要API 19。所以我可以很好地检查a>b并返回1还是-1?如果您点击,您将看到它是一个单行静态函数:
returnlhs