Сравнение атрибутов объектов Player, чтобы проверить, у кого самое короткое имя

#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<
}