java - 对 ArrayList 进行排序按创建顺序 [Android/Java]
问题描述
所以我正在开发一个应用程序,并且我有一个按钮,用户单击该按钮可以循环浏览数组列表的三个排序集。我有它Collections.sort(list)
按数字和字母顺序对列表进行排序,但我试图使它list
按索引号或添加时间排序。
这是我所拥有的:
public class MainActivity extends Activity
{
ArrayList<String> list;
ArrayAdapter adapter;
ListView listView;
public int counter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
list = new ArrayList<>();
listView = findViewById(R.id.listView);
adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,list);
listView.setAdapter(adapter);
addEntries();
listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> p1, View p2, int p3, long p4)
{
}
});
}
public void addEntries(){
for(int e=0; e<=10; e++){
list.add(String.valueOf(e));
}
adapter.notifyDataSetChanged();
}
public void sort(View v){
counter = counter + 1;
if(counter == 2){
counter = 0;
}
switch(counter){
case 0:Collections.sort(list);
message("0");
break;
case 1://code to sort by time/index;
message("1");
break;
}
adapter.notifyDataSetChanged();
}
public void message(String message){
Toast.makeText(getApplicationContext(),message,Toast.LENGTH_SHORT).show();
}
}
解决方案
最新答案
最好在列表中存储一个对象而不是字符串。
class Info {
String value;
Long time;
int index;
}
new ArrayList<Info>()
添加项目后,更新时间戳,并将索引设置为列表长度。
然后按字段排序
list.sort((a,b)-> a.time - b.time )
list.sort((a,b)-> a.value.compareTo(b.value) )
list.sort((a,b)-> a.index - b.index )
您可以使用map
函数轻松获取原始字符串列表。
list.map(it->it.value)
其他问题
添加项目时,您将需要重新排序。
上面的 lambda 有快捷符号。
较早的答案
否则,您需要从其他地方(地图等)获取时间:
list.sort((a,b)-> getTimeFromSomewhere(a) - getTimeFromSomewhere(b) )
您真的应该制作一个副本,以便在按索引排序时仍然拥有基于原始索引的列表:
new ArrayList<String>(list).sort((a,b)-> getTimeFromSomewhere(a) - getTimeFromSomewhere(b) )
要按索引排序,请返回原始列表的副本。
new ArrayList<String>(list)
要按字母顺序排序,请使用默认排序返回原始列表的副本
new ArrayList<String>(list).sort()
推荐阅读
- amazon-web-services - 为每个应用程序用户动态创建 IAM 角色
- sql - 需要对一列进行分组添加获取 Hive 中其他列的计数
- swift - 属性别名(可以说是 Identifiable 最优雅的解决方案)
- c - 将正确的参数传递给 strtok
- python - 如何使用 Python 和 BeautifulSoup 将数据抓取到下一页
- r - 针对模型引入新数据,但产生错误测试数据与模型不匹配!”
- spinnaker - 是否有任何 api 可以在 spinnaker 中执行判断阶段
- angular-material - 如何根据对话框组件中的取消和是按钮更新父组件的材质幻灯片切换值?
- powershell - TeamCity Unresolved reference from powershell script on a powershell step
- twilio - Cloud Run 错误:容器无法启动。无法启动并监听 PORT 环境变量定义的端口