получить строку из цикла for, когда я использую break

У меня есть следующий блок кода (это плагин для сервера bukkit[игра minecraft])

            msg = lang.getString("Kick", "null"); //default msg.
            msg = msg.replace("\\n", "\n");
            int i = 0;
            Player target = null;
            for (i = 0; i < args.length; i++) {
                if (args[i].equalsIgnoreCase("-")){
                    StringBuilder sb = new StringBuilder();
                    for (int ii = i+1; ii < args.length; ii++) {
                            sb.append(args[ii]).append(" ");
                    }
                    msg = sb.toString().trim(); // - that msg I need
                    break;
                } 
                target = (Bukkit.getServer().getPlayer(args[i]));
                target.kickPlayer(msg); // <--- here

Как получить строку "msg" из цикла.
код должен работать так:
Команда типа игрока /command target1 target2 - re a s o n
затем код:
Get target1
Get target2
Получить target3, но target3 имеет значение "-". тогда каждый аргумент после «-» является причиной (msg). (тогда я должен разорвать цикл, чтобы получить игрока)
И кикнуть target1 с помощью Reason(msg). кикнуть target2 с указанием причины (msg).
Но если игрок введет /command target1 target2... target999
Тогда просто выкиньте его с причиной по умолчанию.


person user2250333    schedule 06.04.2013    source источник
comment
можешь повторить этот вопрос? что не так с тем, что у вас есть сейчас?   -  person giorashc    schedule 06.04.2013
comment
При первом просмотре ваш код должен работать нормально. Что с этим не так?   -  person bw2801    schedule 06.04.2013
comment
Почему это break даже там, когда вы все еще хотите использовать msg в цикле?   -  person Mattias Buelens    schedule 06.04.2013
comment
@giorashc Хорошо, я отредактировал сообщение   -  person user2250333    schedule 06.04.2013
comment
@ user2250333 Я обновил свой пост. Проверьте это.   -  person bw2801    schedule 06.04.2013


Ответы (1)


Во-первых, то, как вы ведете аргументы, в данном случае не самое лучшее. Вместо этого используйте for (String argument : args). И еще: нельзя выполнять код в цикле после break.

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

boolean read = false;
String msg = "default message";
List<String> players = new ArrayList<String>();

for (String argument : args) {
    if (!read && !argument.equalsIgnoreCase("-")) {
        players.add(argument);
    } else if (!read && argument.equalsIgnoreCase("-")) {
        read = true;
        msg = "";
    } else {
        msg += argument;
    }
}

for (String player : players) {
    Player target = Bukkit.getServer().getPlayer(player);
    target.kickPlayer(msg);
}

Для этого вам нужно логическое значение, строка сообщения и список, в котором должны быть сохранены все имена целей. Этот код проходит через все аргументы.

Если логическое значение равно false И аргумент не равен -, аргумент сохраняется в списке игроков. В противном случае, если логическое значение равно false, но аргумент равен -, логическое значение устанавливается равным true, а значение строки по умолчанию удаляется. В противном случае (аргумент является частью сообщения) аргумент присоединяется к строке.

Ведь есть еще один цикл, в котором плагин перебирает всех игроков, добавленных в список, и кикает их, показывая им введенное сообщение.

Ваше здоровье!

person bw2801    schedule 06.04.2013
comment
Это неправильно. и не работать. Код должен работать следующим образом: Игрок набирает команду /command target1 target2 - re a s on then code: Получить target1 Получить target2 Получить target3, но target3 равен '-'. тогда каждый аргумент после «-» является причиной (msg). И кикните target1 с помощью Reason(msg). кикнуть target2 с указанием причины (msg). Но если игрок введет /command target1 target2... target999 Тогда просто выкиньте его с причиной по умолчанию. - person user2250333; 06.04.2013
comment
Я понимаю. Вы должны использовать boolean и String и проверить, является ли аргумент -. Когда он установлен с boolean на true. Если логическое значение было ложным, прежде чем установить для строки сообщения значение "", в противном случае присоедините аргумент к строке, если для логического значения установлено значение true. - person bw2801; 06.04.2013
comment
'прежде чем установить строку сообщения в '' hyym, но msg является строкой для всего кода. для получения сообщений из языкового файла (английский или польский) - person user2250333; 06.04.2013
comment
Вы можете сделать это так: msg = lang.getString("Kick", "null"); вместо String msg = "default message";. Пока с помощью команды не будет введено сообщение, строка не изменится. - person bw2801; 06.04.2013
comment
работает с одной проблемой. в предыдущем коде у меня есть ' sb.append(args[ii]).append() 'где и как добавить что-то подобное в этот код? только этот append(), потому что если причина, например: «для бла-бла», тогда я получаю «для бла-бла» - person user2250333; 06.04.2013
comment
Я рад помочь вам. Вы также можете изменить строку msg += argument; на msg += argument + " "; вместо concat(" "), но это на ваше усмотрение. ;) - person bw2801; 07.04.2013