首页 > 解决方案 > 我如何按顺序简化方向数组 {"south", "east"} 等?

问题描述

    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]);
    }

上面的代码简化了位置,但不是按顺序,以便元素的位置不会改变,只有多余的运动才会改变,例如 {"SOUTH", "NORTH", "EAST"} 变成 "EAST" as south和北抵消,我上面的算法不看位置,它只是通过计算南、北等的数量来简化它,然后做一些基本的数学运算。PS,如果可能的话,我希望在没有嵌套循环的情况下解决这个问题。

问题,编写一个函数 dirReduc,它将接受一个字符串数组并返回一个字符串数组,其中删除了不必要的方向(W<->E 或 S<->N 并排)。

标签: javaarrayslistalgorithmsorting

解决方案


说真的,使用普通的 for-each 循环:

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;
}

没必要在这里花哨。


推荐阅读