#java
#java
Вопрос:
Я хочу сравнить имена Объектов Player, которые я сохранил в списке.
У меня есть метод, который добавляет объекты игрока в этот список с именем и полом и выдает им 2 карты из 2 разных колод
затем метод, который я хочу использовать, чтобы сравнить имена и определить, у кого самое короткое имя. Но я вроде как застрял и не знаю, как это исправить.
public List<Speler> spelers = new ArrayList<>(); // creating player list
public void VoegSpelerToe(String naam, String geslacht){
speler = new Speler(naam, geslacht);
spelers.add(speler);
speler.trekKaart(2,schatKaarten);
speler.trekKaart(2,kerkerKaarten);
}
public Speler BeurtSpeler(List<Speler> speler,Comparator<String> comp){
String shortest = speler.get(0);
for(Speler str : spelers) {
if (comp.compare(str, kortste) <0) {
kortste = str;
}
return shortest;
}
Комментарии:
1. Почему бы вам не использовать метод speler.getName() для получения имен и сравнения друг с другом?
2. Могу ли я, как это, перебирать список игроков?
3. Попробуйте кодировать на английском (не на голландском ;-))
4. @mahieus я попытаюсь это сделать:p но это код для школьного проекта, поэтому он должен быть на голландском -_-
Ответ №1:
Учитывая следующий Player
класс
private class Player {
private String name;
public Player(String name) {
this.name = name;
}
public String getName() {
return name;
}
// #toString omitted
}
вы можете найти игрока с самым коротким именем, используя пользовательский Comparator
. Метод compare вернет, -1
если длина имени короче, 0
если оба имени имеют одинаковую длину или 1
имя длиннее второго.
Java 8
private int comparePlayerNameSize(Player player, Player other) {
if (player.name.length() == other.name.length()) {
return 0;
}
return player.name.length() < other.name.length() ? -1 : 1;
}
Вы можете использовать это следующим образом:
players.stream().min(this::comparePlayerNameSize)
.ifPresent((p) -> /* ... */ ); // do something with the player
Полный пример:
Player one = new Player("fooo");
Player two = new Player("foo");
Player three = new Player("bar");
List<Player> players = Arrays.asList(one, two, three);
players.stream().min(this::comparePlayerNameSize)
.ifPresent(System.out::println);
Результирующий результат Player{name='foo'}
.
Предварительная версия Java 8
Если вы не используете Java 8, вы можете использовать Comparator
следующим образом:
private PlayerNameSizeComparator implements Comparator<Player> {
@Override
public int compare(Player p1, Player p2) {
// ...
}
}
за которым следует Collections.min(players, new PlayerNameSizeComparator());
Полный пример:
Player one = new Player("fooo");
Player two = new Player("foo");
Player three = new Player("bar");
List<Player> players = Arrays.asList(one, two, three);
Player min = Collections.min(players, new PlayerNameSizeComparator());
System.out.println(min);
Результирующий результат Player{name='foo'}
.
Пожалуйста, обратите внимание, что Collections.min()
выдаст NoSuchElementException
, если коллекция пуста.
Последнее замечание: если есть несколько игроков с одинаковой длиной имени, первый игрок (в соответствии с порядком элементов в List
) будет возвращен с этой конкретной длиной.
Комментарии:
1. похоже, я не могу вызвать метод stream ()
2. Проверьте свою версию Java с помощью cmd и
java --version
. Если вы не используете Java 8, взгляните на предоставленное решение до Java 8 .3. оке, спасибо, как именно это будет работать со списком<Player>?
4. Вы имеете в виду полный пример в стиле до Java-8?
5. да, потому что я создал список, и в нем всегда минимум 3 максимум 6 игроков, поэтому мне нужно сравнить их всех, чтобы увидеть, у кого самое короткое имя, это пользовательский ввод между именами
Ответ №2:
Создайте компаратор, который сравнивает объекты на основе размера имени игрока (Comparator< Speler>). Затем используйте Collections.min(…, …), чтобы получить самое короткое.
Ответ №3:
Я полагаю, у вас есть метод getName () для вашего спелера.
public Speler getSpelerWithShortestName(){
Speler result = null;
for(Speler sp : spelers){//each spelers from your list
if(result==null){
result = sp;
}
else{
if(result.getName().length()>sp.getName().length()){
result = sp;
}
}
}
return resu<
}