java - 更合适的方法找到具有特定值的实例的索引
问题描述
我有一个类实例的 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);
}
解决方案
基本上,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())
推荐阅读
- c# - 为什么将 StreamReader 对象类型转换为 IDisposable 接口?
- snowflake-cloud-data-platform - 区分大小写的 Okta URL 不适用于 snowsql 和 Python 连接器。任何解决方法?
- java - Kafka:错误连接器的插件类加载器:找不到'org.apache.kafka.connect.file.FileStreamSourceConnector'
- docker-compose - docker-compose:Docker 容器中的 Rsyslog 和 Fluentd 无法通信
- continuous-integration - Packer 不会在 GCloud 上创建图像
- jquery - 进入文本字段时,如何在 JQuery-Button 内有一个文本字段而不触发按钮
- database - Flyway 修复使用 Oracle DB 引发 FlywaySqlException
- zap - 如何在 OWASP ZAP 中捕获 HTTP 请求
- c# - 当应用程序池使用域帐户运行时,IIS 模拟不起作用
- jenkins - JMeter 与 GitHub 和 Jenkins 的集成