Могу ли я сделать массив переменных в Java? - PullRequest
2 голосов
/ 01 мая 2019

Основываясь на другой настройке, у меня есть список переменных, которые должны быть установлены для элементов массива.Как я могу сделать это кратко, без указателей?

Пример: у меня есть строка с шахматными ходами и переменными startRow, startCol, endRow, endCol, цветом, куском (все строки).

Данные поступают из строки, которую я разбил на биты String [].

Но если связанный тип - "A", то строка будет

startRow, startCol, endRow, endCol, color, piece

, но если тип - "E", тогда строка будет

piece, color, startRow, endRow, startCol, endCol

Iесть переменные с одинаковыми именами.Я могу сделать

case "A":
    startRow = bits[0];
    startCol = bits[1];
    (etc)
case "E":
    startRow = bits[2];
    startCol = bits[4];
    (etc)

Но я бы хотел

Vars[] av = {startRow, startCol, endRow, endCol, color, piece};
Vars[] ev = {piece, color, startRow, endRow, startCol, endCol};

и установить Vars [] allv на один и цикл:

allv[i] = bits[i];

C (илиPHP) не вариант!

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Если startRow, startCol и т. Д. Являются полями (в отличие от локальных переменных), вы можете написать анонимную функцию для каждого поля, которое имеет свойство присваивать значение своего аргумента полю.

Например,

List<Consumer<String>> aSetters =
  Arrays.asList(
    s -> startRow = s,
    s -> startCol = s,
    s -> endRow = s,
    s -> endCol = s,
    s -> color = s,
    s -> piece = s);

List<Consumer<String>> eSetters =
  Arrays.asList(
    s -> piece = s,
    s -> color = s,
    s -> startRow = s,
    s -> startCol = s,
    s -> endRow = s,
    s -> endCol = s);

List<Consumer<String>> setters; // initialize to aSetters or eSetters accordingly

for (int i = 0; i < bits.length; i++) {
  setters.get(i).accept(bits[i]);
}

Альтернативой использованию анонимных функций s -> color = s является использование ссылки на метод для установщика для этого поля, если оно доступно (например, this::setColor).

Если startRow и т. Д. Являются локальными переменными, на самом деле нет хорошего способа сделать это, потому что Java не позволяет назначать локальные переменные из анонимных функций.Есть некоторые неприятные хаки, такие как замена каждой переменной массивом длины 1 и присвоение 0-го элемента массива из анонимной функции, что разрешено, но это может быть очень запутанным для чтения.

0 голосов
/ 01 мая 2019

Я предлагаю в качестве решения без проверки ошибок и диапазонов значений (это только схема / идея):

   public static void main(String[] args) {
        int[] mask_A = {1,2,3,4,0};
        int[] mask_B = {2,3,0,4,1};
        String[] source = {"A", "B", "C", "D", "E"};
        System.out.println(Arrays.asList(setMask(source,mask_A)));
        System.out.println(Arrays.asList(setMask(source,mask_B)));
    }
    public static String[] setMask(String[] source, int[]mask) {
        String[] result = new String[mask.length];
        for (int i = 0; i < mask.length; i++) {
            result[i] = source[mask[i]];
        }
        return result;
    }

Результаты:
[B, C, D, E, A]
[C, D, A, E, B]

Другой способ, с Enum:

import static logging.ExampleLogging.Case.*;
public class ExampleLogging {
    public enum Case {
        A, B, C, D, E
    }
    public static void main(String[] args) {
        Case[] mask_A = {A,B,C,D,E};
        Case[] mask_B = {C,D,A,E,B};
        String[] source = {"A", "B", "C", "D", "E"};
        System.out.println(Arrays.asList(setMask(source,mask_A)));
        System.out.println(Arrays.asList(setMask(source,mask_B)));
    }
    public static String[] setMask(String[] source, Case[]mask) {
        String[] result = new String[mask.length];
        for (int i = 0; i < mask.length; i++) {
            result[i] = source[mask[i].ordinal()];
        }
        return result;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...