首页 > 解决方案 > 对 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();
    }
}

标签: javaandroidstringsortingarraylist

解决方案


最新答案

最好在列表中存储一个对象而不是字符串。

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()

推荐阅读