首页 > 解决方案 > 更合适的方法找到具有特定值的实例的索引

问题描述

我有一个类实例的 ArrayList PlayerProp。我想在该数组中找到具有指定值的实例的索引。

要解释PlayerProp包含另一个类的实例Player。我需要找到具有该类的实例的索引Player并将其从索引中删除。

到目前为止,为了尝试这个问题,我刚刚制作了第二个数组,其中包含我需要识别第一个数组中的实例的变量。我认为这应该可行,第二个数组索引应该与第一个数组具有相同的索引。

我认为这应该可行,但我觉得这不是一种非常可靠的方法。有没有更可靠的方法来做到这一点?

List<String> playerListCrazyMode = new ArrayList<String>();
List<PlayerProp> playerCrazyMode = new ArrayList<PlayerProp>();

private void enableCrazy() {

    for(Player player: Bukkit.getOnlinePlayers()) {
        playerListCrazyMode.add(player.getName());
        playerCrazyMode.add(new PlayerProp(player));
    }


}
private void disableCrazy() {
    playerListCrazyMode.clear();
    playerCrazyMode.clear();
}

@EventHandler
public void join(PlayerJoinEvent e) {
    Player playerJoin = e.getPlayer();
    playerListCrazyMode.add(playerJoin.getName());
    playerCrazyMode.add(new PlayerProp(playerJoin));
}

@EventHandler
public void leave(PlayerQuitEvent e) {
    Player playerLeave = e.getPlayer();
    int indexPlayer = playerListCrazyMode.indexOf(playerLeave.getName());
    playerCrazyMode.remove(indexPlayer);

}

标签: java

解决方案


基本上,indexOf内部所做的就是逐个元素地遍历数组。因此,该算法的总体思路如下:

public static <T> int firstIndexOf(Predicate<T> test, List<T> list) {
    int idx = -1;
    if (list != null) {
        for (int i = 0; i < list.size(); i++) {
            if (test.test(list.get(i)) {
                idx = i;
                break;
            }
        }
    }
    return idx;
}

在您的情况下,Predicate将是player -> name.equals(player.getName())


推荐阅读