Java:将两个搜索和两个列表优化为一个

时间:2018-05-07 11:47:13

标签: java algorithm optimization

我试图通过删除重复搜索来优化我的程序,或者只是通过在整个程序中优化一些东西来优化我的程序,然后我遇到了一种方法,我无法找到任何更好的"更好的& #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。

期待收到你的回复

2 个答案:

答案 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-