Вопрос или проблема
Я ищу правильный синтаксис для получения конкретного ChartValue из окончательного 2D массива. Некоторые из этих значений зависят от выполненного внешнего условия. Пожалуйста, подскажите, если реализация кажется неподходящей.
Массив chartsValues2DArray известен до компиляции и, следовательно, должен быть окончательным. Как вы можете видеть, условие применяется только к конкретным (x,y) координатам.
В JavaScript я знаю, что следующий синтаксис правильный, а как насчет Java?
private final static ChartValue[][] chartValues2DArray = (boolean condition) -> { //ошибка компиляции
{ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1,},
{ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1,},
{condition ? ChartValue.VALUE_1 : ChartValue.VALUE_2, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1,},
{ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1,},
{ChartValue.VALUE_1, ChartValue.VALUE_1, condition ? ChartValue.VALUE_1 : ChartValue.VALUE_2, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1,},
{ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, condition ? ChartValue.VALUE_1 : ChartValue.VALUE_2, ChartValue.VALUE_1,},
{ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1,},
{ChartValue.VALUE_1, ChartValue.VALUE_1, condition ? ChartValue.VALUE_1 : ChartValue.VALUE_2, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1,},
};
public static void main(String[] args){
boolean condition = isConditionMet();
int rowIndex=getRowIndex();
int colIndex=getColIndex();
ChartValue chartValue = chartValues2DArray(condition)[rowIndex][colIndex]; //ошибка компиляции??
System.out.println("chartValue: "+chartValue);
}
Ответ или решение
Вопрос, поднятый вами, касается синтаксиса Java для работы с двумерными массивами и условными значениями. Давайте разберем ваш код и исправим ошибки.
Проблема с синтаксисом
В Java нельзя использовать лямбда-выражения или замыкания для создания статических конечных массивов так, как это делается в JavaScript. Статические финальные массивы должны быть инициализированы в момент их объявления, а это невозможно, если вы хотите использовать динамическое условие, такое как boolean condition
.
Чтобы решить эту проблему, вам нужно будет объявить массив, а затем инициализировать его в блоке статической инициализации или в конструкторе. Кроме того, вы не сможете передать переменную condition
как параметр для создания массива. Вместо этого вам нужно создать два различных массива (или использовать дополнительную логику для создания массива) в зависимости от состояния условия.
Вот пример правильной реализации:
public class ChartValueExample {
private static final ChartValue[][] chartValues2DArray;
static {
boolean condition = isConditionMet();
chartValues2DArray = new ChartValue[][] {
{ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1},
{ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1},
{condition ? ChartValue.VALUE_1 : ChartValue.VALUE_2, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1},
{ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1},
{ChartValue.VALUE_1, ChartValue.VALUE_1, condition ? ChartValue.VALUE_1 : ChartValue.VALUE_2, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1},
{ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, condition ? ChartValue.VALUE_1 : ChartValue.VALUE_2, ChartValue.VALUE_1},
{ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1},
{ChartValue.VALUE_1, ChartValue.VALUE_1, condition ? ChartValue.VALUE_1 : ChartValue.VALUE_2, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1, ChartValue.VALUE_1},
};
}
public static void main(String[] args) {
int rowIndex = getRowIndex();
int colIndex = getColIndex();
ChartValue chartValue = chartValues2DArray[rowIndex][colIndex];
System.out.println("chartValue: " + chartValue);
}
// Примерные методы, которые могут быть определены в вашем классе:
private static boolean isConditionMet() {
// Логика для определения значения условия
return true; // или false в зависимости от вашей логики
}
private static int getRowIndex() {
// Логика для определения индекса строки
return 2; // Пример
}
private static int getColIndex() {
// Логика для определения индекса столбца
return 3; // Пример
}
}
enum ChartValue {
VALUE_1,
VALUE_2
}
Объяснение реализации
-
Статический блок инициализации: Мы используем статический блок, чтобы инициализировать массив в момент загрузки класса. Условие
condition
проверяется в этом блоке, и массив создается с соответствующими значениями. -
Доступ к элементам массива: В методе
main
мы можем просто обращаться к элементам массива, используя индексы строк и столбцов, без необходимости передавать условие, так как оно уже учтено при инициализации. -
Методы для получения индексов: Для примера добавлены методы, которые могут возвращать индексы строк и столбцов.
Таким образом, данный подход позволяет инициализировать массив с контролем условия и затем свободно использовать его в дальнейшем коде Java.