2015-11-09 4 views
-2

Моя проблема в том, что только первое значение списка внутри моего config.yml является «действительным» для тестирования. Представьте цикл for, который проверяет список с тремя значениями: «FirstString», «SecondString» и «ThirdString». Если он найдет набор String, например «SecondString», тогда сделайте что-нибудь. Мой цикл for проверяет только первое значение. Итак, в моем примере он никогда не найдет «SecondString», даже жестко он находится в списке. Надеюсь, вы понимаете мою проблему, даже жестко. Я плохо объясняю свои проблемы.Проверяется только первое значение списка

Stym.java (основной класс):

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 (выполнение класса):

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 
+1

Какая часть вашего кода вы смотрите.Вы должны только ввести код, необходимый для объяснения проблемы. – kmecpp

ответ

0

Я думаю, что это просто сводится к некоторым логическим ошибкам. Насколько я могу судить по вашему коду, игрок находится в «кожаной» группе, если и только в том случае, если у него нет ни железа, ни игрока бриллиантового игрока. Игрок находится в «железной» группе, если список металлического игрока содержит свое имя и в «бриллиантовой» группе, если список бриллиантовых игроков содержит их имя. Все это требует некоторых проверок, чтобы увидеть, может ли данная строка быть найдена в определенном массиве/списке.

Вы для петель проверить, является ли какой-либо из String с содержащимся внутри массивов соответствует playerName, который идет в правильном направлении, но ваш метод возвращает ложь, если таковые имеются, даже первый элемент он встречает не равен playerName.

Если у нас есть список: {«Player», «Notch», «Jeb_»}, и мы хотели знать, содержится ли в нем «Notch» String, ваш код вернет false, потому что первый элемент встречи («Player») не равны «Notch». Это не имеет смысла для фрагмента кода, который должен выглядеть, если любой из элементов в списке соответствует заданному значению.

Если вы имели дело с массивами вы можете написать свой собственный маленький общий метод, который проверяет, является ли данный 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 
} 

В этом коде, если текущий элемент мы обход матчей строку, которую мы ищем, мы можем немедленно вернуть истину, вырваться из цикла. Метод возвращает только 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) 
} 
Смежные вопросы