Android Collections.compare () изменить критерии - PullRequest
2 голосов
/ 09 января 2012

Я занимаюсь разработкой игры для Android и сохраняю результаты в текстовом файле вида «100 & playername1,93 & playername1,1950 & playername2» и т. Д., То есть она абсолютно неупорядочена.

Теперь я пытаюсь создать интерфейс с высокими показателями и знаю, что для сортировки результатов я должен использовать String.split(","), а затем String.split("&")[0], чтобы получить результаты и поместить их в ArrayList, а затем вызвать Collections.compare(list). Однако, как только я это сделаю, у меня не будет возможности найти имена, связанные с партитурой.

Может ли кто-нибудь помочь мне с этим, пожалуйста. Я попытался отсортировать всю строку между скобками (поместив фразу «100 & playername1» в массив, но она не может быть отсортирована по порядку величины. Под этим я подразумеваю, что она поставит 100 перед 1950 годом.

Спасибо за любую помощь!

Ответы [ 3 ]

4 голосов
/ 09 января 2012

Создайте класс с именем UsernameScorePair.После того, как вы разделите оценки и имена пользователей, поместите их в пары (по одной для каждого «показателя и имени пользователя»).

Например, это определение класса может работать:

открытый класс UsernameScorePair {

    private String name;
    private int score;

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

    public String getName() {
        return name;
    }

    public int getScore() {
        return score;
    }

}

Создайте класс с именем UsernameScorePairComparator, который реализует Comparator.

В методе compare(Object o1, Object o2) приведите Objects к UsernameScorePairs и сравните оценки.Например:

public class UsernameScorePairComparator {

    public UsernameScorePairComparator() {
    }

    public int compare(Object o1, Object o2) {
        UsernameScorePair usp1 = (UsernameScorePair)o1;
        UsernameScorePair usp2 = (UsernameScorePair)o2;

        return usp1.getScore() - usp2.getScore();
    }
}

Затем используйте Collections.sort следующим образом:

Collections.sort(listofpairs, new UsernameScorePairComparator())

Я не помню, сортируется ли он в порядке возрастания или убывания.Если это возрастающий порядок, то просто измените return usp1.getScore() - usp2.getScore(); на return usp2.getScore() - usp1.getScore();

EDIT

A Comparator в основном сравнивает два объекта.В своем методе compareTo он возвращает отрицательное значение, если первое меньше второго, положительное, если первое больше второго, и ноль, если они оба равны.

Вы можете реализоватьComparator (как я только что сделал), чтобы удовлетворить ваши потребности.Затем, используя Comparator, вы можете использовать стандартные методы API, такие как Collections.sort().

Надеюсь, это сработает!

0 голосов
/ 09 января 2012

Вы можете перебирать элементы и создавать новый Player для каждой строки следующим образом:

public class Player implements Comparable<Player>{

private int mScore;

private final String mName;

public Player(final int score, final String name) {
    mScore = score;
    mName = name;
}

public void setScore(final int score) {
    mScore = score;
}

@Override
public int compareTo(Player other) {
    return mScore - other.mScore;
}

}

Теперь вам просто нужно вызвать Collections.sort(List<Player>); И вы даже можете заставить класс Player реализовать Serializable интерфейс:

import java.io.Serializable;

public class Player implements Comparable<Player>, Serializable {

private static final long serialVersionUID = 8257815475849584162L;

private int mScore;

private final String mName;

public Player(final int score, final String name) {
    mScore = score;
    mName = name;
}

public void setScore(final int score) {
    mScore = score;
}

@Override
public int compareTo(Player other) {
    return mScore - other.mScore;
}

    readObject(){...}
    writeObject(){...}

 }
0 голосов
/ 09 января 2012

Способ состоит в том, чтобы иметь пользовательский объект (назовите его Score), который содержит счет и игрока.Затем поместите ваши результаты в список Score, используя специальный компаратор, который сравнивает результаты.

final String wholeString = "100&playername1,93&playername1,1950&playername2";

final List<Score> scoresForPlayers = new ArrayList<Score>();
final String[] scores = wholeString.split(",");
for (String score : scores) {
    final String[] split = score.split("&");
    scoresForPlayers.add(new Score(Integer.parseInt(split[0]), split[1]));
}
Collections.sort(scoresForPlayers, new Comparator<Score>() {
    @Override
    public int compare(Score o1, Score o2) {
        return o1.score.compareTo(o2.score);
    }
});

class Score {
    private final Integer score;
    private final String player;

    public Score(Integer score, String player) {
        this.score = score;
        this.player = player;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...