Как упростить массив направлений {"юг", "восток"} и т.д. c и c по порядку? - PullRequest
1 голос
/ 11 апреля 2020
    public static String[] dirReduc(String[] arr) {

        List<String> objects = Arrays.asList(arr);

        long northCount = (objects.contains("NORTH")) ? objects.stream().filter("NORTH"::contains).count() : 0;
        long southCount = (objects.contains("SOUTH")) ? objects.stream().filter("SOUTH"::contains).count() : 0;
        long eastCount = (objects.contains("EAST")) ? objects.stream().filter("EAST"::contains).count() : 0;
        long westCount = (objects.contains("WEST")) ? objects.stream().filter("WEST"::contains).count() : 0;

        Map<String, Long> doubleBraceMap  = new HashMap<String, Long>() {{
            put("NORTH", (long)((northCount >= southCount) ? (northCount - southCount) : 0));
            put("SOUTH", (long)((southCount >= northCount) ? (southCount - northCount) : 0));
            put("EAST", (long)((eastCount >= westCount) ? (eastCount - westCount) : 0));
            put("WEST", (long)((westCount >= eastCount) ? (westCount - eastCount) : 0));
        }};

        List<String> formattedArray = new ArrayList<String>();

        doubleBraceMap.keySet().forEach(key ->{

            for(int i = 0; i < doubleBraceMap.get(key); i++) {
                formattedArray.add(key);
            }

        });

        return formattedArray.toArray(new String[0]);
    }

приведенный выше код упрощает расположения, НО не по порядку, так как положения элементов не меняются, только избыточные перемещения, например {"ЮГ", "СЕВЕР", "ВОСТОК"} становится «ВОСТОЧНЫМ», так как юг и север отменяют, мой алгоритм выше не смотрит на позиции, он просто упрощает его, вычисляя количество югов, северов и c, а затем выполняя некоторые основные математические расчеты. PS, я бы хотел, чтобы эта проблема была решена без вложенных циклов, если это возможно.

Задача , напишите функцию dirRedu c, которая будет принимать массив строк и возвращает массив строк с удаленными ненужными направлениями (W <-> E или S <-> N рядом).

1 Ответ

0 голосов
/ 11 апреля 2020

Серьезно, используйте простой старый для каждого l oop:

public static String[] dirReduc(String[] arr) {
    int northsouth = 0, eastwest = 0;
    for (String dir : arr) {
        switch (dir) {
            case "NORTH" -> northsouth++;
            case "EAST" -> eastwest++;
            case "SOUTH" -> northsouth--;
            case "WEST" -> eastwest--;
        }
    }
    int size = Math.abs(northsouth) + Math.abs(eastwest);
    String[] result = new String[size];
    if (northsouth > 0) {
        Arrays.fill(result, 0, northsouth, "NORTH");
    } else {
        Arrays.fill(result, 0, -northsouth, "SOUTH");
    }
    if (eastwest > 0) {
        Arrays.fill(result, size-eastwest, size, "EAST");
    } else {
        Arrays.fill(result,  size+eastwest, size, "WEST");
    }
    return result;
}

Не нужно здесь придумывать.

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