Как сделать значение карты пустым при сравнении его со значениями другой карты?

Этот код предоставит текущий logcat активности

Process logcatProc;
List <String> progs = new ArrayList <String>();

progs.add("logcat");
progs.add("-v");
progs.add(mFormat.getValue());
if (mBuffer != Buffer.MAIN) {
        progs.add("-b");
        progs.add(mBuffer.getValue());
}
progs.add("*:" + mLevel);

logcatProc = Runtime.getRuntime()
                .exec(progs.toArray(new String[0]));

mReader = new BufferedReader(new InputStreamReader(
                logcatProc.getInputStream()), 1024);

String line;
while (mRunning && (line = mReader.readLine()) != null) {
    if (!mRunning) {
            break;
    }
    if (line.length() == 0) {
            continue;
    }
    if (mIsFilterPattern) {
        if (mFilterPattern != null && !mFilterPattern.matcher(line).find()) {
            continue;
        }
    } else {
        if (mFilter != null && !line.toLowerCase().contains(mFilter.toLowerCase())) {
            continue;
        }
    }
    synchronized (mLogCache) {
            mLogCache.add(line);
    }
}
-1
задан Karthik 28 February 2019 в 16:46
поделиться

2 ответа

Без использования потоков вы можете решить это следующим образом:

public static void main(String[] args) {

    // setup the input and output maps
    LinkedHashMap<String, List<String>> region1 = new LinkedHashMap<>();
    LinkedHashMap<String, List<String>> region2 = new LinkedHashMap<>();
    LinkedHashMap<String, List<String>> region3 = new LinkedHashMap<>();
    region1.put("R1", asList("A", "B", "C", "D"));
    region2.put("R2", asList("G", "A", "D", "B"));

    // for each key in region2
    for(String key : region2.keySet()) {

        // make a copy of the values for that key
        List<String> values = new ArrayList<>(region2.get(key));

        // remove all the duplicates from each of the lists in region1
        for (List<String> baseValues : region1.values()) {
            values.removeAll(baseValues);
        }

        // if there are any remaining list values
        if (values.size() > 0) {
            // put them into region3
            region3.put(key, values);
        }
    }

    System.out.println(region3);
}
0
ответ дан Jason 28 February 2019 в 16:46
поделиться

Редактировать: оптимизировано.
Stream только. Исходные объекты не изменены.
Немного долго, однако.

final Map<String, List<String>> region1 = new LinkedHashMap<>();
region1.put("R1", new ArrayList<>(Arrays.asList("A", "B", "C", "D")));

final Map<String, List<String>> region2 = new LinkedHashMap<>();
region2.put("R2", new ArrayList<>(Arrays.asList("A", "G", "C", "B")));
region2.put("R3", new ArrayList<>(Arrays.asList("A", "G", "C", "B")));

final Stream<Entry<String, List<String>>> entries =
        region1.values()
               .stream()
               .flatMap(values ->
                       region2.entrySet()
                              .stream()
                              .map(e -> {
                                  final List<String> value =
                                          e.getValue()
                                           .stream()
                                           .filter(v -> !values.contains(v))
                                           .collect(toList());
                                  return new SimpleEntry<>(e.getKey(), value);
                              })
               );

final Map<String, List<String>> result = entries.collect(toMap(Entry::getKey, Entry::getValue));

И именно поэтому мне нравятся Stream с. С выводом типа (Java 10+) это даже чище.

0
ответ дан LppEdd 28 February 2019 в 16:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: