Переписать через getOrDefault

169
07 сентября 2021, 23:10

Помогите реализовать addToMap с помощью gefOrDefault

package src;
import java.io.*;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
    private static Pattern pattern = Pattern.compile("class\\s+(?<class>\\w+)(\\s+extends\\s+(?<extends>\\w+))?(\\s+implements\\s+(?<implements>\\w+))?");
    private static Map<String, Set<String>> classMap = new HashMap<>();
    public static void main(String[] args) throws IOException {
        File src = new File("D:\\untitled1\\src");
        listFilesForFolder(src);
        classMap.forEach((key, value) -> System.out.println(key + " : " + value));
    }
    public static void listFilesForFolder(final File folder) throws IOException {
        for (final File fileEntry : folder.listFiles()) {
            if (fileEntry.isDirectory()) {
                listFilesForFolder(fileEntry);
            } else {
                parseFile(fileEntry);
            }
        }
    }
    private static void parseFile(File file) throws IOException {
        try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
            reader.lines().forEach(line -> {
                Matcher matcher = pattern.matcher(line);
                if (matcher.find()) {
                    String s = matcher.group();
                    addToMap(s);
                }
            });
        }
    }
    private static void addToMap(String s) {
        String[] split = s.split("(\\sextends\\s|\\simplements\\s|\\s\\{|,\\s)");
        String child = split[0];
        for (int i = 1; i < split.length; i++) {
            String parent = split[i];
            if (!classMap.containsKey(split[i])) {
                Set<String> set = new HashSet<>();
                set.add(child);
                classMap.put(parent, set);
            } else {
                classMap.get(parent).add(child);
            }
        }
    }
}
Answer 1

Тут больше подходит computeIfAbsent(K, Function).

  1. Если карта не содержит значения по указанному ключу, то оно попытается его вычислить с помощью переданной функции, а потом запишет и вернет (если вычисленное значение будет равно null, в карту его не поместит. Но будет возвращено).
  2. Если карта уже содержит значение, то оно его вернет без изменений.

Код:

for(int i = 1; i < split.length; i++) {
    classMap.computeIfAbsent(split[i], key -> new HashSet<>()).add(child);
}

А если стоит конкретная цель — применить getOrDefault(Object, V), то все будет попроще.

  1. Если карта содержит значение по указанному ключу, оно его вернет.
  2. Если карта не содержит значение, то оно вернет запасное значение, которое преданно 2-ым аргументом (в карту оно помещено не будет, нужно самим).

Код:

for(int i = 1; i < split.length; i++) {
    Set<String> set = classMap.getOrDefault(split[i], new HashSet<>());
    set.add(child);
    if(set.size() == 1) classMap.put(split[i], set);
}
READ ALSO
Optional&lt;T&gt; в List&lt;T&gt;

Optional<T> в List<T>

Java 8Можно ли преобразовать Optional в List?

113
Объединение многоугольников в один

Объединение многоугольников в один

Есть два многоугольника заданных массивами с координатамиНужно как-то объединить их в один многоугольник и получить на выходе новый массив...

99