Чтобы использовать метод Math.round
, вам нужно изменить только одну строку в вашем коде:
double inches = Math.round(centimeters / 2.54);
Если вы хотите сохранить 2 десятичных цифры, вы можете использовать это:
double inches = Math.round( (centimeters / 2.54) * 100.0 ) / 100.0;
Кстати, я предлагаю вам лучший способ справиться с этими проблемами без округления.
Ваша проблема заключается только в отображении, поэтому вам не нужно менять модель данных , вы можете просто изменить его отображение. Чтобы напечатать номера в нужном вам формате, вы можете оставить свой логический код таким образом и напечатать результат следующим образом:
import java.text.DecimalFormat;
DecimalFormat df = new DecimalFormat("#.##");
System.out.println(df.format(inches) + " Inch Is " +
df.format(centimeters) + " centimeters");
Строка "#.##"
- это то, как будет отображаться ваш номер (в этом примере с двумя десятичными цифрами ).
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());
Шаги:
Мой ответ основан на предположении, что у вас есть такая структура:
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());
вы можете использовать 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());
}
}
}
Наконец-то я сделал это так:
и все работает отлично. Спасибо!
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);
}
}
Переопределите equals и hashCode методы вашего класса объектов Gamer.
Затем, перед добавлением объекта в ArrayList, проверьте Arraylist.contains()
, если да, то вы можете либо вызвать метод ArrayList.indexOf()
, чтобы получить экземпляр этого объекта в ArrayList
, увеличить значение LeaderPoints и вызвать ArrayList.set()
, чтобы установить обратно экземпляр в той же позиции.