仅测试列表的第一个值
Only the first value of a list is being tested
我的问题是,只有 config.yml
中列表的第一个值是 "valid" 用于测试。想象一个 for 循环,它测试具有三个值的列表:
"FirstString"、"SecondString" 和 "ThirdString"。如果它找到一个集合字符串,如 "SecondString",则执行某些操作。我的 for 循环只测试第一个值。
因此,在我的示例中,它永远不会找到 "SecondString",即使它在列表中也是如此。我希望你能理解我的问题,即使我很难解释我的问题。
Stym.java
(主要class):
import org.bukkit.plugin.java.JavaPlugin;
public class Stym extends JavaPlugin {
@Override
public void onEnable() {
getConfig().options().copyDefaults(true);
saveConfig();
registerCommands();
}
public void registerCommands() {
GroupCommand groupCommandClass = new GroupCommand(this);
getCommand("GROUP").setExecutor(groupCommandClass);
}
public boolean isGroup(String groupName, String playerName) {
if(groupName.equalsIgnoreCase("LEATHER")) {
for(String ironPlayerName : getConfig().getStringList("groups.iron")) {
if(!ironPlayerName.equals(playerName)) {
for(String diamondPlayerName : getConfig().getStringList("groups.diamond")) {
if(!diamondPlayerName.equals(playerName)) {
return true;
} else {
return false;
}
}
} else {
return false;
}
}
} else if(groupName.equalsIgnoreCase("IRON")) {
for(String ironPlayerName : getConfig().getStringList("groups.iron")) {
if(ironPlayerName.equals(playerName)) {
return true;
} else {
return false;
}
}
} else if(groupName.equalsIgnoreCase("DIAMOND")) {
for(String diamondPlayerName : getConfig().getStringList("groups.diamond")) {
if(diamondPlayerName.equals(playerName)) {
return true;
} else {
return false;
}
}
}
return false;
}
}
GroupCommand
(执行class):
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class GroupCommand implements CommandExecutor {
Stym stym;
GroupCommand(Stym stymClass) {
stym = stymClass;
}
@Override
public boolean onCommand(CommandSender sender, Command command,
String label, String[] arguments) {
if(arguments.length == 0) {
if(sender instanceof Player) {
if(!sender.isOp()) {
if(stym.isGroup("LEATHER", sender.getName())) {
sender.sendMessage("You are made out of leather!");
return true;
} else if(stym.isGroup("IRON", sender.getName())) {
sender.sendMessage("You are made out of iron!");
return true;
} else if(stym.isGroup("DIAMOND", sender.getName())) {
sender.sendMessage("You are made out of diamond!");
return true;
} else {
sender.sendMessage("You are a cyborg!");
return true;
}
} else {
sender.sendMessage("You are an operator!");
return true;
}
} else {
sender.sendMessage("You are a god!");
return true;
}
} else if(arguments.length == 1) {
if(stym.isGroup("LEATHER", arguments[0])) {
sender.sendMessage(arguments[0] + " " + "is made out of leather!");
return true;
} else if(stym.isGroup("IRON", arguments[0])) {
sender.sendMessage(arguments[0] + " " + "is made out of iron!");
return true;
} else if(stym.isGroup("DIAMOND", arguments[0])) {
sender.sendMessage(arguments[0] + " " + "is made out of diamond!");
return true;
} else {
sender.sendMessage(arguments[0] + " " + "is a cyborg!");
return true;
}
} else {
sender.sendMessage("Not supported yet!");
return true;
}
}
}
plugin.yml
:
name: Stym
main: Stym
version: 1.3.3.7
commands:
group:
description: Some fancy description
usage: /group or /group <player_name>
config.yml
:
groups:
iron:
- Player //Works well and will find
- Another_Player // Won't find
diamond:
- Rich_Player //Works well and will find
我认为这只是一些逻辑错误。据我从您的代码中可以看出,当且仅当他既不在铁牌球员也不在钻石球员列表中时,他就属于 "leather" 组。如果铁牌球员名单包含他们的名字,则该球员属于 "iron" 组;如果钻石球员名单包含他们的名字,则该球员属于 "diamond" 组。所有这一切都需要一些检查,看看是否可以在特定的 array/list.
中找到给定的字符串
你的 for 循环检查数组中包含的任何 String
s 是否匹配 playerName
,这是正确的方向,但你的方法 returns false 如果有的话,即使它遇到的 first 元素也不等于 playerName
.
如果我们有一个列表:{"Player"、"Notch"、"Jeb_"},我们想知道是否包含 String
"Notch"在其中,您的代码将 return false 因为它遇到的第一个元素 ("Player") 不等于 "Notch"。对于应该查看列表中的 any 元素是否与给定值匹配的一段代码来说,这没有意义。
如果您正在处理数组,您可以编写自己的通用小方法来检查给定的 String
是否在数组内部,如下所示:
public static boolean contains(String value, String[] array) {
for (String element : array) { // For each element in array
if (element.equals(value)) { // If we have found the matching element -> return true (we don't need to keep looking)
return false;
}
}
return false; // No match was found -> return false
}
在这段代码中,如果我们正在遍历的当前元素与我们要查找的字符串相匹配,我们可以立即return为真,跳出循环。如果遍历了 所有 个元素并且我们找不到单个匹配项,则该方法仅 return 为 false。
因为你在配置文件的上下文中处理 List<String>
s 你可以简单地使用 contains(String)
方法来检查玩家名称列表是否始终包含某个名称缩短代码并使其更易于阅读。
您的方法可能看起来像这样,应该有效:
public boolean isGroup(String groupName, String playerName) {
List<String> ironPlayers = getConfig().getStringList("groups.iron"); // Get list of names in iron group
List<String> diamondPlayers = getConfig().getStringList("groups.diamond"); // Get list of names in diamond group
boolean isIron = ironPlayers.contains(playerName); // Boolean value whether playerName is in iron group
boolean isDiamond = diamondPlayers.contains(playerName); // Boolean value whether playerName is in diamond group
if (groupName.equalsIgnoreCase("LEATHER") && !isIron && !isDiamond) {
// Return true for leather if the player name is not in the iron and diamond group
return true;
} else if (groupName.equalsIgnoreCase("IRON") && isIron && !isDiamond) {
// Return true for iron if the player name is in the iron group but not in the diamond group
return true;
} else if (groupName.equalsIgnoreCase("DIAMOND") && !isIron && isDiamond) {
// Return true for diamond if the player name is in the diamond group but not in the iron group
return true;
}
return false; // In any other case return false (player could be in both lists, or invalid groupName)
}
我的问题是,只有 config.yml
中列表的第一个值是 "valid" 用于测试。想象一个 for 循环,它测试具有三个值的列表:
"FirstString"、"SecondString" 和 "ThirdString"。如果它找到一个集合字符串,如 "SecondString",则执行某些操作。我的 for 循环只测试第一个值。
因此,在我的示例中,它永远不会找到 "SecondString",即使它在列表中也是如此。我希望你能理解我的问题,即使我很难解释我的问题。
Stym.java
(主要class):
import org.bukkit.plugin.java.JavaPlugin;
public class Stym extends JavaPlugin {
@Override
public void onEnable() {
getConfig().options().copyDefaults(true);
saveConfig();
registerCommands();
}
public void registerCommands() {
GroupCommand groupCommandClass = new GroupCommand(this);
getCommand("GROUP").setExecutor(groupCommandClass);
}
public boolean isGroup(String groupName, String playerName) {
if(groupName.equalsIgnoreCase("LEATHER")) {
for(String ironPlayerName : getConfig().getStringList("groups.iron")) {
if(!ironPlayerName.equals(playerName)) {
for(String diamondPlayerName : getConfig().getStringList("groups.diamond")) {
if(!diamondPlayerName.equals(playerName)) {
return true;
} else {
return false;
}
}
} else {
return false;
}
}
} else if(groupName.equalsIgnoreCase("IRON")) {
for(String ironPlayerName : getConfig().getStringList("groups.iron")) {
if(ironPlayerName.equals(playerName)) {
return true;
} else {
return false;
}
}
} else if(groupName.equalsIgnoreCase("DIAMOND")) {
for(String diamondPlayerName : getConfig().getStringList("groups.diamond")) {
if(diamondPlayerName.equals(playerName)) {
return true;
} else {
return false;
}
}
}
return false;
}
}
GroupCommand
(执行class):
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class GroupCommand implements CommandExecutor {
Stym stym;
GroupCommand(Stym stymClass) {
stym = stymClass;
}
@Override
public boolean onCommand(CommandSender sender, Command command,
String label, String[] arguments) {
if(arguments.length == 0) {
if(sender instanceof Player) {
if(!sender.isOp()) {
if(stym.isGroup("LEATHER", sender.getName())) {
sender.sendMessage("You are made out of leather!");
return true;
} else if(stym.isGroup("IRON", sender.getName())) {
sender.sendMessage("You are made out of iron!");
return true;
} else if(stym.isGroup("DIAMOND", sender.getName())) {
sender.sendMessage("You are made out of diamond!");
return true;
} else {
sender.sendMessage("You are a cyborg!");
return true;
}
} else {
sender.sendMessage("You are an operator!");
return true;
}
} else {
sender.sendMessage("You are a god!");
return true;
}
} else if(arguments.length == 1) {
if(stym.isGroup("LEATHER", arguments[0])) {
sender.sendMessage(arguments[0] + " " + "is made out of leather!");
return true;
} else if(stym.isGroup("IRON", arguments[0])) {
sender.sendMessage(arguments[0] + " " + "is made out of iron!");
return true;
} else if(stym.isGroup("DIAMOND", arguments[0])) {
sender.sendMessage(arguments[0] + " " + "is made out of diamond!");
return true;
} else {
sender.sendMessage(arguments[0] + " " + "is a cyborg!");
return true;
}
} else {
sender.sendMessage("Not supported yet!");
return true;
}
}
}
plugin.yml
:
name: Stym
main: Stym
version: 1.3.3.7
commands:
group:
description: Some fancy description
usage: /group or /group <player_name>
config.yml
:
groups:
iron:
- Player //Works well and will find
- Another_Player // Won't find
diamond:
- Rich_Player //Works well and will find
我认为这只是一些逻辑错误。据我从您的代码中可以看出,当且仅当他既不在铁牌球员也不在钻石球员列表中时,他就属于 "leather" 组。如果铁牌球员名单包含他们的名字,则该球员属于 "iron" 组;如果钻石球员名单包含他们的名字,则该球员属于 "diamond" 组。所有这一切都需要一些检查,看看是否可以在特定的 array/list.
中找到给定的字符串你的 for 循环检查数组中包含的任何 String
s 是否匹配 playerName
,这是正确的方向,但你的方法 returns false 如果有的话,即使它遇到的 first 元素也不等于 playerName
.
如果我们有一个列表:{"Player"、"Notch"、"Jeb_"},我们想知道是否包含 String
"Notch"在其中,您的代码将 return false 因为它遇到的第一个元素 ("Player") 不等于 "Notch"。对于应该查看列表中的 any 元素是否与给定值匹配的一段代码来说,这没有意义。
如果您正在处理数组,您可以编写自己的通用小方法来检查给定的 String
是否在数组内部,如下所示:
public static boolean contains(String value, String[] array) {
for (String element : array) { // For each element in array
if (element.equals(value)) { // If we have found the matching element -> return true (we don't need to keep looking)
return false;
}
}
return false; // No match was found -> return false
}
在这段代码中,如果我们正在遍历的当前元素与我们要查找的字符串相匹配,我们可以立即return为真,跳出循环。如果遍历了 所有 个元素并且我们找不到单个匹配项,则该方法仅 return 为 false。
因为你在配置文件的上下文中处理 List<String>
s 你可以简单地使用 contains(String)
方法来检查玩家名称列表是否始终包含某个名称缩短代码并使其更易于阅读。
您的方法可能看起来像这样,应该有效:
public boolean isGroup(String groupName, String playerName) {
List<String> ironPlayers = getConfig().getStringList("groups.iron"); // Get list of names in iron group
List<String> diamondPlayers = getConfig().getStringList("groups.diamond"); // Get list of names in diamond group
boolean isIron = ironPlayers.contains(playerName); // Boolean value whether playerName is in iron group
boolean isDiamond = diamondPlayers.contains(playerName); // Boolean value whether playerName is in diamond group
if (groupName.equalsIgnoreCase("LEATHER") && !isIron && !isDiamond) {
// Return true for leather if the player name is not in the iron and diamond group
return true;
} else if (groupName.equalsIgnoreCase("IRON") && isIron && !isDiamond) {
// Return true for iron if the player name is in the iron group but not in the diamond group
return true;
} else if (groupName.equalsIgnoreCase("DIAMOND") && !isIron && isDiamond) {
// Return true for diamond if the player name is in the diamond group but not in the iron group
return true;
}
return false; // In any other case return false (player could be in both lists, or invalid groupName)
}