Как добавить в историю рекордов лучшую активность, имя игрока, который набрал лучший результат? - PullRequest
0 голосов
/ 02 октября 2019

У меня есть приложение с опросом и заданием, в котором я хочу, чтобы там были лучшие 5 очков с игроками, которые сделали эти очки. У меня есть 2 ArrayLists, в которых хранятся оценки для одного, а в другом хранятся имена игроков. Мне удалось составить список с оценками, но я не знаю, как правильно расположить имена рядом с аналогами.

Изображение того, что у меня есть: https://i.imgur.com/MX9qUP2.png

Иизображение того, что я ищу: https://i.imgur.com/6PHHsIt.png

Я пытался с картой, но я не знал, что 2 одинаковых ключа не могут быть сохранены, так что это невозможно, но может быть способ получитькакой-то массив списков с индексами, но он может иметь 2 разные информации, я не знаю.

Мои 2 ArrayLists:

public static ArrayList<Integer> scoresList = new ArrayList<>();

public static ArrayList<String> namesList = new ArrayList<>();

Мой способ получить 5 лучших результатов:

public class HistoryActivity extends AppCompatActivity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_history);

        TextView first = (TextView) findViewById(R.id.history_activity_first);
        TextView second = (TextView) findViewById(R.id.history_activity_second);
        TextView third = (TextView) findViewById(R.id.history_activity_third);
        TextView fourth = (TextView) findViewById(R.id.history_activity_fourth);
        TextView fifth = (TextView) findViewById(R.id.history_activity_fifth);

        Collections.sort(scoresList, Collections.reverseOrder());

        first.setText("Best score is : " + scoresList.get(0));

        if (scoresList.size() >= 2) {
            second.setText("2nd best score is : " + scoresList.get(1));
        }

        if (scoresList.size() >= 3) {
            third.setText("3rd best score is : " + scoresList.get(2));
        }

        if (scoresList.size() >= 4) {
            fourth.setText("4th best score is : " + scoresList.get(3));
        }

        if (scoresList.size() >= 5) {
            fifth.setText("5th best score is : " + scoresList.get(4));
        }
    }
}

Спасибо

1 Ответ

0 голосов
/ 02 октября 2019

Создайте класс для представления записи счета / имени:

public class ScoreEntry implements Comparable<ScoreEntry> {
    public final String name;
    public final int score;

    public ScoreEntry (String name, int score){
        this.name = name;
        this.score = score;
    }

    public int compareTo (ScoreEntry other){
        return Integer.signum(score - other.score);
    }
}

Затем вы можете поместить их в ArrayList. Внедрив Comparable подобным образом, вы разрешите сортировку списка по баллам.

Возможно, вы захотите включить дату в этот класс, чтобы оценка, полученная на более ранней дате, была выше, чем у другой записи с таким же баллом. ,Вы можете использовать System.nanoTime(), чтобы получить время, необходимое для создания счета.

public class ScoreEntry implements Comparable<ScoreEntry> {
    public final String name;
    public final int score;
    public final long time;

    public ScoreEntry (String name, int score, long time){
        this.name = name;
        this.score = score;
        this.time = time;
    }

    public int compareTo (ScoreEntry other){
        if (score == other.score)
            return Long.signum(other.time - time);
        return Integer.signum(score - other.score);
    }
}

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

Comparator<ScoreEntry> nameComparator = new Comparator<>(){
    public int compare(ScoreEntry first, ScoreEntry second) {
        int res = String.CASE_INSENSITIVE_ORDER.compare(first.name, second.name);
        if (res == 0)
            res = first.name.compareTo(second.name);
        return res;
    }
}

Затем вы передадите это методу сортировки:

Collections.sort(scoresList, nameComparator);
...