Этот код предоставит текущий 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);
}
}
Без использования потоков вы можете решить это следующим образом:
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);
}
Редактировать: оптимизировано.
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+
) это даже чище.