我试图通过删除重复搜索来优化我的程序,或者只是通过在整个程序中优化一些东西来优化我的程序,然后我遇到了一种方法,我无法找到任何更好的"更好的& #34;解决方案如此,并且很想知道是否有人可以指出我的方向来改进它。
首先,我的代码是我尝试优化的:
public Player spaceBattle(Player player1, Player player2) {
ArrayList<Ship> listOfShipsPlayer1 = this.getShipsOfPlayer(player1);
ArrayList<Ship> listOfShipsPlayer2 = this.getShipsOfPlayer(player2);
Random random = new Random();
int player1hits = 0, player2hits = 0, rolledDie;
for (Ship aShip : listOfShipsPlayer1) {
rolledDie = random.nextInt(10) + 1;
if (rolledDie >= aShip.getShipType().getCombatValue()) {
player1hits += 1;
}
}
for (Ship aShip : listOfShipsPlayer2) {
rolledDie = random.nextInt(10) + 1;
if (rolledDie >= aShip.getShipType().getCombatValue()) {
player2hits += 1;
}
}
for (int i = 0; i < player1hits; ++i) {
if (this.getShipsOfPlayer(player2).size() > 0) {
this.listOfShips.remove(listOfShipsPlayer2.get(i));
} else {
break;
}
}
for (int i = 0; i < player2hits; ++i) {
if (this.getShipsOfPlayer(player1).size() > 0) {
this.listOfShips.remove(listOfShipsPlayer1.get(i));
} else {
break;
}
}
正如你在这里看到的,我运行相同的算法两次,以便检查第一个Player1然后检查Player2并添加更新它们各自的命中。然后,对于每个玩家的点击量,我然后移除一艘船。 我想知道是否有可能改变这段代码,以便能够为每个玩家提供重复的代码,但它自动可以首先通过player1,然后在一个循环中通过player2。
期待收到你的回复
答案 0 :(得分:0)
您可以创建方法。
private int hitShips(List<Ship> ships) {
int result = 0;
for (Ship ship : ships) {
rolledDie = random.nextInt(10) + 1;
if (rolledDie >= ship.getShipType().getCombatValue()) {
result++;
}
}
return result;
}
使您的代码
int player1hits = hitShips(listOfShipsPlayer1);
int player2hits = hitShips(listOfShipsPlayer2);
和类似的从列表中删除船只。
void removeShips(List<Ship> ships, int remove) {
int removeCount = Math.max(ships.size(), remove);
Iterator<Ship> it = ships.iterator();
for (int i = 0; i < removeCount; i++) {
it.remove();
}
}
与
removeShips(getShipsOfPlayer(player2), player1hits);
removeShips(getShipsOfPlayer(player1), player2hits);
我不确定为什么你总是从列表的头部移除船只,因为战斗值似乎是一个东西,但这只是一个侧面说明。
我不会这么称之为“优化”,但删除重复代码总是好的。
答案 1 :(得分:0)
您可以将removeShips优化为:
void removeShips(List<Ship> ships, int numHits) {
int numToRemove = Math.min(ships.size(), numHits);
if (numToRemove > 0) {
ships.subList(0, numToRemove).clear();
}
}
此方法调用只会导致一次System.arraycopy
调用,这会将所有剩余元素移到左侧。
https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#subList-int-int-