Java - Collections - 操作 Collection、Map 工具類

By sunwc 2023-03-29 Java

Collections 工具類 常用方法

  • reverse(List) :反轉 List 中的元素
  • shuffle(List):對 List 集合元素進行隨機排序
  • sort(List):根據元素的自然順序對指定 List 集合元素按升冪排序
  • sort(List, Comparator):根據指定的 Comparator 產生的順序對 List 集合元素進行排序
  • swap(List, int, int):將指定 list 集合中的 index i元素 與 index j元素進行交換
  • Object max(Collection):根據元素的自然排序,回傳給定集合中的最大元素
  • Object max(Collection, Comparator):根據 Comparator 指定的順序,回傳給訂集合中的最大元素
  • Object min(Collection)
  • Object min(Collection, Comparator)
  • int frequency(Collection, Object):回傳指定集合中指定元素的出現次數
  • void copy(List dest, List src):將 src 中的內容複製到 dest 中
/**
 * @author sunwc
 * @create 2023-03-29 下午 03:20
 */
public class CollectionsTest {

    @Test
    public void testCollections() {

        List list = new ArrayList();
        list.add(353);
        list.add(0);
        list.add(4838);
        list.add(43);
        list.add(52);
        list.add(-432);
        list.add(9);

        // 使用Collecitons.copy(),要先撐開dest collection 的長度 至 source 的 長度
        // tips: 先讓裝載的元素一樣多
        List dest = Arrays.asList(new Object[list.size()]);
        // 再把值複製過來
        Collections.copy(dest, list);

        System.out.println(dest);
    }
}
  • boolean replaceAll(List list, Object oldVal, Object newVal):使用新值替換 List 對
  • 同步控制 synchronizedXxx()方法:該方法可使指定集合包裝成執行緒同步的集合,進而解決多執行緒併發存取集合時的執行緒不安全問題


練習

  • 隨機的數字List,請reverse list後顯示;從大到小排序顯示
@Test
    public void testCollections2() {

        List list = new ArrayList();
        list.add(353);
        list.add(0);
        list.add(4838);
        list.add(43);
        list.add(52);
        list.add(-432);
        list.add(9);

        Collections.reverse(list);
        System.out.println("reverse="+list);

        Collections.sort(list, new Comparator<Integer>() {

            @Override
            public int compare(Integer o1, Integer o2) {
                return -Integer.compare(o1,o2);
            }
        });
        System.out.println("大到小="+list);
    }

輸出結果:

reverse=[9, -432, 52, 43, 4838, 0, 353]
大到小=[4838, 353, 52, 43, 9, 0, -432]

  • 請把學生名與考試分數記錄到集合中,例如TreeSet(Student(id,name,score)); 並按分數顯示前三名成績的學生姓名
/**
 * @author sunwc
 * @create 2023-03-29 下午 03:20
 */
public class CollectionsTest {

    @Test
    public void testCollections3() {

        TreeSet<Student> treeSet = new TreeSet<>();
        treeSet.add(new Student(1001, "Jack", 99));
        treeSet.add(new Student(1002, "Hannah", 88));
        treeSet.add(new Student(1003, "Lily", 45));
        treeSet.add(new Student(1004, "Becky", 84));
        treeSet.add(new Student(1005, "May", 60));
        treeSet.add(new Student(1006, "Denial", 77));
        treeSet.add(new Student(1007, "Vicent", 67));
        treeSet.add(new Student(1008, "Potter", 56));
        treeSet.add(new Student(1009, "Hank", 98));

        Iterator<Student> iterator = treeSet.iterator();
        int count = 0;
        while (iterator.hasNext() && count <= 2) {
            Student next = iterator.next();
            System.out.println("學生姓名:"+next.getName()+", 學生成績:"+next.getScore());
            count++;
        }
    }
}

class Student implements Comparable<Student> {

    private int id;
    private String name;
    private int score;

    public Student(int id, String name, int score) {
        this.id = id;
        this.name = name;
        this.score = score;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("Student{");
        sb.append("id=").append(id);
        sb.append(", name='").append(name).append('\'');
        sb.append(", score=").append(score);
        sb.append('}');
        return sb.toString();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return id == student.id && score == student.score && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, score);
    }


    /**
     * 成績從高到低
     * @param o
     * @return
     */
    @Override
    public int compareTo(Student o) {
        return -Integer.compare(this.getScore(), o.getScore());
    }
}

輸出結果:

學生姓名:Jack, 學生成績:99
學生姓名:Hank, 學生成績:98
學生姓名:Hannah, 學生成績:88