/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.stream.*;
import java.util.function.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
private static List<String> skipElements1(List<String> elements, Set<String> elementsToDelete) {
ListIterator<String> iterator = elements.listIterator();
while (iterator.hasNext()) {
element = iterator.next();
if (element.equals("D")) {
iterator.previous();
iterator.add("G");
iterator.next();
}
if (elementsToDelete.contains(element)) {
iterator.remove();
}
}
return elements;
}
private static List<String> skipElements2(List<String> inputElements, Set<String> elementsToDelete) {
return inputElements.stream()
.flatMap(entry -> "D".equals(entry) ? Stream.of("G", entry) : Stream.of(entry))
.filter(Predicate.not(elementsToDelete::contains)).collect(Collectors.toList());
}
static void test(int testId, List<String> inputElements, Set<String> skipElements) {
List<String> result1;
List<String> result2;
try {
List
<String
> workCopy
= new ArrayList(inputElements
); result1 = skipElements1(workCopy, skipElements);
System.
err.
println(String.
format("Test %d failed in ver1 - %s", testId, e
)); return;
}
try {
List
<String
> workCopy
= new ArrayList(inputElements
); result2 = skipElements2(workCopy, skipElements);
System.
err.
printf("Test %d failed in ver2 - %s\n", testId, e
); return;
}
boolean equal = result1.toString().equals(result2.toString());
if (equal) {
System.
out.
printf("Test %d: OK\n", testId
); } else {
System.
out.
printf("Test %d: failed (%s <> %s)\n", testId, result1, result2
); }
}
{
Set
<String
> elementsToDelete
= Set.
of("A",
"C",
"E");
List<String> elements = Stream.of("A", "B", "C", "D", "E")
.
collect(Collectors.
toCollection(LinkedList::new));
test
(1,
List.
of("A",
"B",
"C",
"D",
"E"),
Set.
of("A",
"C",
"E")); test
(2,
List.
of("D",
"A",
"B",
"C",
"D",
"E"),
Set.
of("A",
"C",
"E")); test
(3,
List.
of("A",
"B",
"C",
"D",
"E"),
Set.
of("A",
"C",
"E",
"D")); test
(4,
List.
of("D",
"E"),
Set.
of("A",
"C",
"E")); test
(5,
List.
of("E",
"D"),
Set.
of("A",
"C",
"E")); test
(7,
List.
of("D"),
Set.
of("A",
"C",
"E")); test
(8,
List.
of("D",
"D"),
Set.
of("A",
"C",
"E")); test
(9,
List.
of("D",
"D",
"D"),
Set.
of("A",
"C",
"E")); }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLio7CmltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uKjsKCi8qIE5hbWUgb2YgdGhlIGNsYXNzIGhhcyB0byBiZSAiTWFpbiIgb25seSBpZiB0aGUgY2xhc3MgaXMgcHVibGljLiAqLwpjbGFzcyBJZGVvbmUKewoJcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IHNraXBFbGVtZW50czEoTGlzdDxTdHJpbmc+IGVsZW1lbnRzLCBTZXQ8U3RyaW5nPiBlbGVtZW50c1RvRGVsZXRlKSB7CgkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBlbGVtZW50cy5saXN0SXRlcmF0b3IoKTsKCQlTdHJpbmcgZWxlbWVudDsKCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJICAgICAgICBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwoJCSAgICAgICAgaWYgKGVsZW1lbnQuZXF1YWxzKCJEIikpIHsKCQkgICAgICAgICAgICAgICAgaXRlcmF0b3IucHJldmlvdXMoKTsKCQkgICAgICAgICAgICAgICAgaXRlcmF0b3IuYWRkKCJHIik7CgkJICAgICAgICAgICAgICAgIGl0ZXJhdG9yLm5leHQoKTsKCQkgICAgICAgIH0KCQkKCQkgICAgICAgIGlmIChlbGVtZW50c1RvRGVsZXRlLmNvbnRhaW5zKGVsZW1lbnQpKSB7CgkJICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnJlbW92ZSgpOwoJCSAgICAgICAgfQoJCX0KCQlyZXR1cm4gZWxlbWVudHM7Cgl9CgoJcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IHNraXBFbGVtZW50czIoTGlzdDxTdHJpbmc+IGlucHV0RWxlbWVudHMsIFNldDxTdHJpbmc+IGVsZW1lbnRzVG9EZWxldGUpIHsKCQlyZXR1cm4gaW5wdXRFbGVtZW50cy5zdHJlYW0oKQoJICAgIAkuZmxhdE1hcChlbnRyeSAtPiAiRCIuZXF1YWxzKGVudHJ5KSA/IFN0cmVhbS5vZigiRyIsIGVudHJ5KSA6IFN0cmVhbS5vZihlbnRyeSkpCgkgICAgCS5maWx0ZXIoUHJlZGljYXRlLm5vdChlbGVtZW50c1RvRGVsZXRlOjpjb250YWlucykpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7ICAgICAgICAKCX0KCQoJc3RhdGljIHZvaWQgdGVzdChpbnQgdGVzdElkLCBMaXN0PFN0cmluZz4gaW5wdXRFbGVtZW50cywgU2V0PFN0cmluZz4gc2tpcEVsZW1lbnRzKSB7CgkgICAgTGlzdDxTdHJpbmc+IHJlc3VsdDE7IAoJICAgIExpc3Q8U3RyaW5nPiByZXN1bHQyOyAKCQl0cnkgewogICAgCSAgICBMaXN0PFN0cmluZz4gd29ya0NvcHkgPSBuZXcgQXJyYXlMaXN0KGlucHV0RWxlbWVudHMpOwkKICAgIAkgICAgcmVzdWx0MSA9IHNraXBFbGVtZW50czEod29ya0NvcHksIHNraXBFbGVtZW50cyk7CgkJfSBjYXRjaChFeGNlcHRpb24gZSkgewoJCQlTeXN0ZW0uZXJyLnByaW50bG4oU3RyaW5nLmZvcm1hdCgiVGVzdCAlZCBmYWlsZWQgaW4gdmVyMSAtICVzIiwgdGVzdElkLCBlKSk7CgkJCXJldHVybjsKCQl9CgoJCXRyeSB7CiAgICAJICAgIExpc3Q8U3RyaW5nPiB3b3JrQ29weSA9IG5ldyBBcnJheUxpc3QoaW5wdXRFbGVtZW50cyk7CQogICAgCSAgICByZXN1bHQyID0gc2tpcEVsZW1lbnRzMih3b3JrQ29weSwgc2tpcEVsZW1lbnRzKTsKCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7CgkJCVN5c3RlbS5lcnIucHJpbnRmKCJUZXN0ICVkIGZhaWxlZCBpbiB2ZXIyIC0gJXNcbiIsIHRlc3RJZCwgZSk7CgkJCXJldHVybjsKCQl9CgkJCgkJYm9vbGVhbiBlcXVhbCA9IHJlc3VsdDEudG9TdHJpbmcoKS5lcXVhbHMocmVzdWx0Mi50b1N0cmluZygpKTsKCQlpZiAoZXF1YWwpIHsKCQkJU3lzdGVtLm91dC5wcmludGYoIlRlc3QgJWQ6IE9LXG4iLCB0ZXN0SWQpOwoJCX0gZWxzZSB7CgkJCVN5c3RlbS5vdXQucHJpbnRmKCJUZXN0ICVkOiBmYWlsZWQgKCVzIDw+ICVzKVxuIiwgdGVzdElkLCByZXN1bHQxLCByZXN1bHQyKTsKCQl9Cgl9CgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCVNldDxTdHJpbmc+IGVsZW1lbnRzVG9EZWxldGUgPSBTZXQub2YoIkEiLCAiQyIsICJFIik7CgkJCgkJTGlzdDxTdHJpbmc+IGVsZW1lbnRzID0gU3RyZWFtLm9mKCJBIiwgIkIiLCAiQyIsICJEIiwgIkUiKQoJCSAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oTGlua2VkTGlzdDo6bmV3KSk7CgkJICAgICAgICAKCQl0ZXN0KDEsIExpc3Qub2YoIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIpLCBTZXQub2YoIkEiLCAiQyIsICJFIikpOyAgICAgICAgCgkJdGVzdCgyLCBMaXN0Lm9mKCJEIiwgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIpLCBTZXQub2YoIkEiLCAiQyIsICJFIikpOyAgICAgICAgCgkJdGVzdCgzLCBMaXN0Lm9mKCJBIiwgIkIiLCAiQyIsICJEIiwgIkUiKSwgU2V0Lm9mKCJBIiwgIkMiLCAiRSIsICJEIikpOyAgICAgICAgCgkJdGVzdCg0LCBMaXN0Lm9mKCJEIiwgIkUiKSwgU2V0Lm9mKCJBIiwgIkMiLCAiRSIpKTsgICAgICAgIAoJCXRlc3QoNSwgTGlzdC5vZigiRSIsICJEIiksIFNldC5vZigiQSIsICJDIiwgIkUiKSk7ICAgICAgICAKCQl0ZXN0KDYsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBTZXQub2YoIkEiLCAiQyIsICJFIikpOyAgICAgICAgCgkJdGVzdCg3LCBMaXN0Lm9mKCJEIiksIFNldC5vZigiQSIsICJDIiwgIkUiKSk7ICAgICAgICAKCQl0ZXN0KDgsIExpc3Qub2YoIkQiLCAiRCIpLCBTZXQub2YoIkEiLCAiQyIsICJFIikpOyAgICAgICAgCgkJdGVzdCg5LCBMaXN0Lm9mKCJEIiwgIkQiLCAiRCIpLCBTZXQub2YoIkEiLCAiQyIsICJFIikpOyAgICAgICAgCiAgIH0KfQ==