Удалить дубликат из пользовательского ArrayList по параметру

Чтобы использовать метод Math.round, вам нужно изменить только одну строку в вашем коде:

double inches = Math.round(centimeters / 2.54);

Если вы хотите сохранить 2 десятичных цифры, вы можете использовать это:

double inches = Math.round( (centimeters / 2.54) * 100.0 ) / 100.0;

Кстати, я предлагаю вам лучший способ справиться с этими проблемами без округления.

Ваша проблема заключается только в отображении, поэтому вам не нужно менять модель данных , вы можете просто изменить его отображение. Чтобы напечатать номера в нужном вам формате, вы можете оставить свой логический код таким образом и напечатать результат следующим образом:

  1. Добавьте этот импорт в начале вашего кода:
    import java.text.DecimalFormat;
    
  2. Распечатайте вывод таким образом:
    DecimalFormat df = new DecimalFormat("#.##");
    System.out.println(df.format(inches) + " Inch Is " +
                       df.format(centimeters) + " centimeters");
    

Строка "#.##" - это то, как будет отображаться ваш номер (в этом примере с двумя десятичными цифрами ).

0
задан OrdinaryDraft 26 February 2019 в 13:35
поделиться

4 ответа

writeRead.getArrayList(this).stream()
            .map(Game::getWinnerGamer)
            .collect(Collectors.groupingBy(Gamer::getName, Collectors.summingInt(Gamer::getLeaderboardScore)))
            .entrySet()
            .stream()
            .sorted(Comparator.comparing(Map.Entry<String, Integer>::getValue).reversed())
            .map(entry -> new Gamer(entry.getKey(), entry.getValue()))
            .collect(Collectors.toList());

Шаги:

  1. извлекают победителей
  2. групп победителей по имени и суммируют их оценки. В результате вы получите Map
  3. get entrySet этой карты
  4. открытый поток на этом entySet
  5. сортировка по оценкам в направлении DESC
  6. вход в карту для Gamer (создать новый экземпляр геймера для каждой записи)
  7. собирать в список

Мой ответ основан на предположении, что у вас есть такая структура:

class Game {
    private Gamer winnerGamer;
    // getter & setter
}

class Gamer {
    private String name;
    private Integer leaderboardScore;
    // getters & setters && AllArgsContructor
}

Кстати: если вы переопределяете равенства и хеш-код в классе Gamer, вы можете избежать воссоздания Gamer с помощью этого:

writeRead.getArrayList(this).stream()
            .map(Game::getWinnerGamer)
            .collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(Gamer::getLeaderboardScore)))
            .entrySet()
            .stream()
            .sorted(Comparator.comparing(Map.Entry<Gamer, Integer>::getValue).reversed())
            .map(Map.Entry::getKey)
            .collect(Collectors.toList());
0
ответ дан Vladyslav Diachenko 26 February 2019 в 13:35
поделиться

вы можете использовать Set вместо ArrayList для уникального значения.

переопределить HashCode и метод Equal .

Set<Gamer> gamerNoDuplicate=new HashSet();
if (gameResult != null) {
    for (int i = 0; i < gameResult.size(); i++) {
        if(gamerNoDuplicate.contains(gameResult.get(i).getWinnerGamer()){
            Gamer alreadyExist = gamerNoDuplicate.indexOf(gameResult.get(i).getWinnerGamer());
            alreadyExist.setLeaderPoints(alreadyExist.getLeaderPoints()+ gameResult.get(i).getWinnerGamer().getLeaderPoints());
        }else{
            gamerNoDuplicate.add(gameResult.get(i).getWinnerGamer());
        }
    }
}
0
ответ дан Rakesh 26 February 2019 в 13:35
поделиться

Наконец-то я сделал это так:

и все работает отлично. Спасибо!

if (gameResult != null) {


        for (int i = 0; i < gameResult.size(); i++) {
            gamerList.add(gameResult.get(i).getWinnerGamer());
        }

        /* --------- */


        for (int i = 0; i < gamerList.size(); i++) {
            Gamer gamer = gamerList.get(i);
            gamer.setLeaderboardScore(1);
            boolean isInArray = false;

            if (!gamerNoDuplicate.isEmpty()) {
                for (int j = 0; j < gamerNoDuplicate.size(); j++) {
                    if (gamer.getName().equals(gamerNoDuplicate.get(j).getName())) {
                        gamerNoDuplicate.get(j).addLeaderscorePoint();
                        isInArray = true;
                    }
                }

                if (!isInArray) {
                    gamerNoDuplicate.add(gamer);
                }

            } else gamerNoDuplicate.add(gamer);
        }
    }
0
ответ дан Joffrey B. 26 February 2019 в 13:35
поделиться

Переопределите equals и hashCode методы вашего класса объектов Gamer.

Затем, перед добавлением объекта в ArrayList, проверьте Arraylist.contains(), если да, то вы можете либо вызвать метод ArrayList.indexOf(), чтобы получить экземпляр этого объекта в ArrayList, увеличить значение LeaderPoints и вызвать ArrayList.set(), чтобы установить обратно экземпляр в той же позиции.

0
ответ дан Akash Shah 26 February 2019 в 13:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: