Java: Solution câu hỏi và bài tập phần Generics

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
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
» Tiếp: Solution câu hỏi và bài tập Collections
« Trước: Hệ thống quản lý tin tức (news)
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!