Java: Solution câu hỏi và bài tập phần Generics
Giải phóng thời gian, khai phóng năng lực
Xem phần câu hỏi và bài tập tại ĐÂY.
1. Answer:
public final class Algorithm { public static <T> int countIf(Collection<T> c, UnaryPredicate<T> p) { int count = 0; for (T elem : c) if (p.test(elem)) ++count; return count; } }
where the generic UnaryPredicate interface is defined as follows:
public interface UnaryPredicate<T> { public boolean test(T obj); }
For example, the following program counts the number of odd integers in an integer list:
import java.util.*; class OddPredicate implements UnaryPredicate<Integer> { public boolean test(Integer i) { return i % 2 != 0; } } public class Test { public static void main(String[] args) { Collection<Integer> ci = Arrays.asList(1, 2, 3, 4); int count = Algorithm.countIf(ci, new OddPredicate()); System.out.println("Number of odd integers = " + count); } }
The program prints:
Number of odd integers = 2
2. nswer: No. The greater than (>) operator applies only to primitive numeric types.
3. Answer:
public final class Algorithm { public static <T> void swap(T[] a, int i, int j) { T temp = a[i]; a[i] = a[j]; a[j] = temp; } }
4. Answer: You should use generics because:
- The Java compiler enforces tighter type checks on generic code at compile time.
- Generics support programming types as parameters.
- Generics enable you to implement generic algorithms.
5. Answer:
public class Pair { public Pair(Object key, Object value) { this.key = key; this.value = value; } public Object getKey() { return key; } public Object getValue() { return value; } public void setKey(Object key) { this.key = key; } public void setValue(Object value) { this.value = value; } private Object key; private Object value; }
6. Answer:
public static int findFirstGreaterThan(Comparable[] at, Comparable elem) { // ... }
7. Answer: Yes.
8. Answer:
import java.util.*; public final class Algorithm { public static <T extends Object & Comparable<? super T>> T max(List<? extends T> list, int begin, int end) { T maxElem = list.get(begin); for (++begin; begin < end; ++begin) if (maxElem.compareTo(list.get(begin)) < 0) maxElem = list.get(begin); return maxElem; } }
9. Answer: No. You cannot create a static field of the type parameter T.
10. Answer: No. Because Node<Circle> is not a subtype of Node<Shape>.
11. Answer: Yes.
Node<String> node = new Node<>(); Comparable<String> comp = node;
12. Answer:
import java.util.*; public final class Algorithm { public static <T> int findFirst(List<T> list, int begin, int end, UnaryPredicate<T> p) { for (; begin < end; ++begin) if (p.test(list.get(begin))) return begin; return -1; } // x > 0 and y > 0 public static int gcd(int x, int y) { for (int r; (r = x % y) != 0; x = y, y = r) { } return y; } }
The generic UnaryPredicate interface is defined as follows:
public interface UnaryPredicate<T> { public boolean test(T obj); }
The following program tests the findFirst method:
import java.util.*; class RelativelyPrimePredicate implements UnaryPredicate<Integer> { public RelativelyPrimePredicate(Collection<Integer> c) { this.c = c; } public boolean test(Integer x) { for (Integer i : c) if (Algorithm.gcd(x, i) != 1) return false; return c.size() > 0; } private Collection<Integer> c; } public class Test { public static void main(String[] args) throws Exception { List<Integer> li = Arrays.asList(3, 4, 6, 8, 11, 15, 28, 32); Collection<Integer> c = Arrays.asList(7, 18, 19, 25); UnaryPredicate<Integer> p = new RelativelyPrimePredicate(c); int i = ALgorithm.findFirst(li, 0, li.size(), p); if (i != -1) { System.out.print(li.get(i) + " is relatively prime to "); for (Integer k : c) System.out.print(k + " "); System.out.println(); } } }
The program prints:
11 is relatively prime to 7 18 19 25
Giải phóng thời gian, khai phóng năng lực