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 рядом).