2015-01-17 2 views
0

Здравствуйте, я должен получить максимальное число от arraylist в Java. ia m получение ошибки T- не входит в связанный интерфейс java. lang. сопоставимо, есть ли другой способ сортировки arralist. Вот мой пример кода.Максимальное число arraylist

private void CreateHighestScorePlayer(LinearLayout layoutForHighScore) { 
    HighScoreManager highScoreManager = HighScoreManager.getInstance(getApplicationContext()); 
    ArrayList<Score> scores = highScoreManager.getScore(); 
    Collections.sort(scores); 
    scores.get(scores.size() -1); 

} 
+0

Вам необходимо определить пользовательский компаратор для класса Score. –

+0

Я знаю, что есть какой-либо другой способ сортировки – user3826166

+0

№ Класс 'Score' должен быть либо' Comparable', либо вы должны предоставить 'Comparator'. Java не знает, как сортировать свой класс самостоятельно. Как его сортировать, на каких полях? Вы должны сообщить об этом, выполнив «Сравнивать» или передав собственный «Компаратор». В чем проблема? –

ответ

1

Если вы хотите получить максимальный элемент, вы должны использовать метод Collections.max. У него есть версия, которая принимает произвольный компаратор в качестве аргумента.

Что-то вроде этого:

Score result = Collections.max(scores, new Comparator<Score>() { 
    @Override 
    public int compare(Score score1, Score score2) { 
     // Compare them here 
    } 
}); 
+0

Collection.max same issue – user3826166

+0

@ user3826166 Вы используете версию со компаратором? – kraskevich

3

Collections.sort общий метод, со следующей подписью:

public static <T extends Comparable<? super T>> void sort(List<T> list) 

Это означает, что вы должны передать в качестве аргумента List<T> где T расширяет Comparable<? super T>.

Так у вас есть два решения, вы можете превратить ваш Score класс в

class Score implements Comparable<Score> { 

    public int compareTo(Score other) { 
    ... 
    } 
} 

Или вы можете использовать Collection.sort(List<T>, Comparator<? super T> c) пропускание обычая Comparator для нот класса.

Первое решение лучше, если вы считаете, что у вас есть контроль над классом Score, так как он даст оценку, которую можно заказать с другими оценками.

2

Необходимо, чтобы ваш объект Score реализовал Comparable, а затем позвоните Collections.max на ArrayList. Или вы можете вызвать перегруженную версию max с помощью Comparator. В любом случае, ваш код должен знать, что делает объект Score более крупным, меньшим или равным другому.

На самом деле мы создали видеоурок с образцом кода на Comparable и Comparatorhere. Главное - понять разницу между ними при принятии решения о том, что использовать.

0

Если вы просто хотите найти самый высокий балл, вы можете использовать простую конструкцию Java 8. Если ваш Score класс выглядит примерно следующее:

public static class Score { 
    private final int score; 

    Score(int score) { 
     this.score = score; 
    } 

    public int getScore() { 
     return score; 
    } 
} 

Затем вы можете stream ваши List<Score> так:

List<Score> scores = 
     Arrays.asList(new Score(100), new Score(200), new Score(50)); 

final Optional<Score> max = 
     scores.stream().max((score1, score2) -> Integer.compare(score1.getScore(), score2.getScore())); 

if (max.isPresent()) { 
    Score score = max.get(); 

    // Do stuff 
} else { 
    // Handle when there are no scores 

} 

Это также использует Comparator, как описано в некоторых других ответов. Comparator построен как lamdba следующим образом:

(score1, score2) -> Integer.compare(score1.getScore(), score2.getScore()) 
Смежные вопросы