Сортировка ArrayList <String>по порядку создания [Android / Java] - PullRequest
0 голосов
/ 16 сентября 2018

Итак, я работаю над приложением, и у меня есть кнопка, в которой пользователь нажимает, чтобы переключаться между тремя наборами заказов для списка массивов.У меня это где 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();
    }
}

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018
    ArrayList<String> list = new ArrayList<>();
    for (int e = 0; e <= 10; e++) {
        list.add(String.valueOf(e));
    }

    Collections.sort(list);
    System.out.println("Sorted as strings:  " + list);

    Collections.sort(list, Comparator.comparingInt(Integer::parseInt));
    System.out.println("Sorted numerically: " + list);

Выход:

Sorted as strings:  [0, 1, 10, 2, 3, 4, 5, 6, 7, 8, 9]
Sorted numerically: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Comparator.comparingInt является новым в Java 8 и может быть доступно только в новых версиях Android. Эквивалент Java 7 более простой, но существует. Ваша поисковая система может помочь.

Более позолоченное решение: спроектируйте класс модели и составьте список экземпляров этого класса, а не список строк. Пусть ваш класс включает Instant время создания, чтобы вы могли сортировать по нему.

Не могли бы вы привести пример?

Редактировать: вот простой пример класса модели. Вы лучше знаете, какие у вас записи и что нужно указывать в записи.

public class Entry {

    String name;
    final Instant created = Instant.now();

    public Entry(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public Instant getCreated() {
        return created;
    }

    @Override
    public String toString() {
        return name;
    }

}

Помещение экземпляров этого класса в список и сортировка его:

        ArrayList<Entry> list = new ArrayList<>();
        for (int e = 0; e <= 10; e++) {
            list.add(new Entry(String.valueOf(e)));
        }

        Collections.sort(list, Comparator.comparing(Entry::getName));
        System.out.println("Sorted by name:          " + list);

        Collections.sort(list, Comparator.comparing(Entry::getCreated));
        System.out.println("Sorted by creation time: " + list);

Так как метод toString класса модели просто печатает имя (не время создания), вывод очень похож на то, что было раньше:

Sorted by name:          [0, 1, 10, 2, 3, 4, 5, 6, 7, 8, 9]
Sorted by creation time: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Если вы хотите увидеть, что мы действительно отсортировали наши собственные объекты, а не строки, вы можете поэкспериментировать с изменением метода toString. Пример:

    @Override
    public String toString() {
        return name + ' ' + created.atZone(ZoneId.of("Pacific/Niue"));
    }
0 голосов
/ 16 сентября 2018

Последний ответ

Лучше всего хранить объект в списке вместо строки.

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)

Другие вопросы

  • Вам нужно будет выполнить повторную сортировку при добавлении элементов.

  • Существуют сокращенные обозначения к вышеуказанным лямбдам.


Старый ответ

В противном случае вам нужно получить время откуда-то еще (карта и т. Д.):

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...