-
Notifications
You must be signed in to change notification settings - Fork 10
/
RemoveDemo.java
115 lines (94 loc) · 2.94 KB
/
RemoveDemo.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import java.util.ConcurrentModificationException;
import java.util.Set;
import java.util.TreeSet;
/**
* Demonstrates that modifying a collection while iterating through that
* collection is a bad idea.
*/
public class RemoveDemo {
/** Example used to demonstrate remove methods. */
private static final Set<String> words = Set.of("ant", "bee", "cow", "dog", "elk");
/**
* Uses a traditional for loop with {@link TreeSet#pollFirst()} within the
* loop. Notice that we are missing dog and elk in the loop output, and that
* they are not removed from the set!
*/
public static void traditionalFor() {
// create a fresh copy
TreeSet<String> copy = new TreeSet<>(words);
for (int i = 0; i < copy.size(); i++) {
// retrieves and **removes** first element
String first = copy.pollFirst();
System.out.printf("size = %d, i = %d, element = %s, set = %s%n",
copy.size(), i, first, copy);
}
System.out.println("after loop: " + copy);
}
/**
* Uses an enhanced for loop with {@link TreeSet#pollFirst()} within the loop.
* Notice how we get a {@link ConcurrentModificationException} thrown on the
* first iteration!
*/
public static void enhancedFor() {
// create a fresh copy
TreeSet<String> copy = new TreeSet<>(words);
try {
for (String word : copy) {
// retrieves and **removes** first element
String first = copy.pollFirst();
System.out.printf("size = %d, element = %s, set = %s (word = %s)%n",
copy.size(), first, copy, word);
}
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("after loop: " + copy);
}
/**
* Uses a while loop with {@link TreeSet#pollFirst()} within the loop. This
* example works properly for removing elements. Other operations, especially
* those that add elements, may require other strategies.
*/
public static void whileLoop() {
// create a fresh copy
TreeSet<String> copy = new TreeSet<>(words);
while (copy.size() > 0) {
// retrieves and **removes** first element
String first = copy.pollFirst();
System.out.printf("size = %d, element = %s, set = %s%n",
copy.size(), first, copy);
}
System.out.println("after loop: " + copy);
}
/**
* Of course, if we really wanted to remove ALL the elements, there are much
* simpler ways for us to proceed.
*/
public static void usingClear() {
// create a fresh copy
TreeSet<String> copy = new TreeSet<>(words);
copy.clear();
System.out.println("after loop: " + copy);
}
/**
* Shows the output of the examples above.
*
* @param args unused
*/
public static void main(String[] args) {
System.out.println("Original: " + words);
System.out.println();
System.out.println("Traditional For Loop:");
traditionalFor();
System.out.println();
System.out.println("Enhanced For Loop:");
enhancedFor();
System.out.println();
System.out.println("While Loop:");
whileLoop();
System.out.println();
System.out.println("Using Clear:");
usingClear();
}
}