Недавно я изучил тернарные операторы и практиковал их, делая старый код, который я написал некоторое время назад, более приятным. Пытаясь сделать это в цикле for разными способами, я не могу понять, как это сделать. Я пробовал:
for (hotbarFirst ? (x = 0; x < mc.player.inventoryContainer.getInventory().size(); x++) :
(x = mc.player.inventoryContainer.getInventory().size(); x > 0; x--)) {
и
for (hotbarFirst ? (x = 0) : (x = mc.player.inventoryContainer.getInventory().size());
hotbarFirst ? (x < mc.player.inventoryContainer.getInventory().size()) : (x > 0);
hotbarFirst ? (x++) : (x--)){
}
Первый способ дает мне unexpected token ошибок, а второй — not a statement ошибок. Кажется, я должен быть в состоянии сделать это так или иначе, так что я просто неправильно подхожу к этому или есть другой способ сделать это, не создавая два цикла for.
(не обращайте внимания на функции, они для игры, в которой я сделал мод)
(Кроме того, если вы не заметили, что я пытаюсь перебрать набор чисел два либо сзади вперед, либо спереди назад, в зависимости от того, является ли логическое значение истинным или ложным)
исходный код:
public static int getItem(Item itemofChoice, boolean hotbarFirst) {
if (mc.player == null) return -1;
for (int x = 0; x < mc.player.inventoryContainer.getInventory().size(); x++) {
if ((x == 0 || x == 5 || x == 6 || x == 7 || x == 8)) continue;
ItemStack s = mc.player.inventoryContainer.getInventory().get(x);
if (s.isEmpty()) continue;
if (s.getItem().equals(itemofChoice)) return x;
}
return -1;
}
Я пытаюсь заставить его повторяться в обратном порядке, если параметр bool истинен
@Sweeper ммм, это не совсем форматирование
Я считаю, что ваш исходный код намного легче читать.




Вот один из способов сделать это:
int size = mc.player.inventoryContainer.getInventory().size();
for (int x = (hotbarFirst ? 0 : size-1); (hotbarFirst ? x < size : x >= 0) ; x += (hotbarFirst ? 1 : -1)) {
...
}
Ого, это то, что я пытался сделать во второй попытке, но это имеет больше смысла. Мне нравится то, что вы сделали с += и минусом. Большое спасибо за вашу помощь
@ArthurTeaTree Я собирался опубликовать свой ответ с дополнительными пояснениями, но Андреас сделал это первым. Я не хочу повторять один и тот же ответ снова, поэтому я кратко объясню здесь. Причина, по которой ваши попытки не сработали, заключается в том, что тернарный оператор ожидает выражения в качестве своих операндов, а цикл for ожидает операторов до первого ; и после второго ;. Поэтому вам следует только переписать разные выражения в ваших двух циклах for в выражения троичного оператора, что и сделал ответ Андреа.
@Sweeper Чтобы немного придраться: он ожидает «выражения выражений» , а не просто утверждения. Блок if также является оператором, но здесь он невозможен :P. Просто для справки также определение базового цикла for: docs.oracle.com/javase/specs/jls/se13/html/…
@Sweeper, да, теперь я понимаю, как это работает, я научился, глядя на примеры в репозитории, поэтому у меня действительно не было хорошего понимания. Спасибо за вашу помощь.
конечно, ``` public static int getItem(Item itemofChoice, boolean hotbarFirst) { if (mc.player == null) return -1; for (int x = 0; x < mc.player.inventoryContainer.getInventory().size(); x++) { if ((x == 0 || x == 5 || x == 6 || x == 7 || х == 8)) продолжить; ItemStack s = mc.player.inventoryContainer.getInventory().get(x); если (s.isEmpty()) продолжить; если (s.getItem().equals(itemofChoice)) вернуть x; } вернуть -1; }``` Я хочу сделать так, чтобы
hotbar first paramон выполнялся в обратном порядке.