C語言中文網 目錄

Java Collection類:sort()升序排序、reverse()降序排序、copy()復制、fill()填充

< 上一頁Java Map集合 Java泛型下一頁 >

Collections 類提供了許多操作集合的靜態方法,借助這些靜態方法可以實現集合元素的排序、填充和復制等操作。下面介紹 Collections 類中操作集合的常用方法。

正向排序

使用 Collections 類的靜態方法 sort() 可以對集合中的元素進行升序排序。這要求列表中的所有元素都必須實現 Comparable 接口,而且所有元素都必須是使用指定比較器可相互比較的。

sort() 方法主要有如下兩種重載形式。
  1. void sort(List list):根據元素的自然順序對集合中的元素進行升序排序。
  2. void sort(List list,Comparator comparator):按 comparator 參數指定的排序方式對集合中的元素進行排序。

例 1

編寫一個程序,對用戶輸入的 5 個商品價格進行排序后輸出。這里要求使用 Collections 類中 sort() 方法按從低到局的順序對其進行排序,最后將排序后的成績輸出。

具體實現代碼如下:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Test10
{
    public static void main(String[] args)
    {
        Scanner input=new Scanner(System.in);
        List prices=new ArrayList();
        for(int i=0;i<5;i++)
        {
            System.out.println("請輸入第 "+(i+1)+" 個商品的價格:");
            int p=input.nextInt();
            prices.add(Integer.valueOf(p));    //將錄入的價格保存到List集合中
        }
        Collections.sort(prices);    //調用sort()方法對集合進行排序
        System.out.println("價格從低到高的排列為:");
        for(int i=0;i<prices.size();i++)
        {
            System.out.print(prices.get(i)+"\t");
        }
    }
}

如上述代碼,循環錄入 5 個價格,并將每個價格都存儲到已定義好的 List 集合 prices 中,然后使用 Collections 類的 sort() 方法對該集合元素進行升序排序。最后使用 for 循環遍歷 users 集合,輸出該集合中的元素。

該程序的執行結果如下所示。
請輸入第 1 個商品的價格:
85
請輸入第 2 個商品的價格:
48
請輸入第 3 個商品的價格:
66
請輸入第 4 個商品的價格:
80
請輸入第 5 個商品的價格:
18
價格從低到高的排列為:
18    48    66    80    85

逆向排序

與 sort() 方法的作用相反,調用 reverse() 靜態方法可以對指定集合元素進行逆向排序。該方法的定義如下:
void reverse(List list)    //對集合中的元素進行反轉排序

例 2

循環錄入 5 個商品的名稱,并按錄入時間的先后順序進行降序排序,即后錄入的先輸出。

下面編寫程序,使用 Collections 類的 reverse() 方法對保存到 List 集合中的 5 個商品名稱進行反轉排序,并輸出排序后的商品信息。具體的實現代碼如下:
import java.util.ArrayList;
import java.util.Coliections;
import java.util.List;
import java.util.Scanner;
public class Test11
{
    public static void main(String[] args)
    {
        Scanner input=new Scanner(System.in);
        List students=new ArrayList();
        System.out.println("******** 商品信息 ********");
        for(int i=0;i<5;i++)
        {
            System.out.println("請輸入第 "+(i+1)+" 個商品的名稱:");
            String name=input.next();
            students.add(name);    //將錄入的商品名稱存到List集合中
        }
        Collections.reverse(students);    //調用reverse()方法對集合元素進行反轉排序
        System.out.println("按錄入時間的先后順序進行降序排列為:");
        for(int i=0;i<5;i++)
        {
            System.out.print(students.get(i)+"\t");
        }
    }
}

如上述代碼,首先循環錄入 5 個商品的名稱,并將這些名稱保存到 List 集合中,然后調用 Collections 類中的 reverse() 方法對該集合元素進行反轉排序。最后使用 for 循環將排序后的集合元素輸出。

執行該程序,輸出結果如下所示。
******** 商品信息 ********
請輸入第 1 個商品的名稱:
果粒橙
請輸入第 2 個商品的名稱:
冰紅茶
請輸入第 3 個商品的名稱:
礦泉水
請輸入第 4 個商品的名稱:
軟面包
請輸入第 5 個商品的名稱:
巧克力
按錄入時間的先后順序進行降序排列為:
巧克力    軟面包    礦泉水    冰紅茶    果粒橙   

復制

Collections 類的 copy() 靜態方法用于將指定集合中的所有元素復制到另一個集合中。執行 copy() 方法后,目標集合中每個已復制元素的索引將等同于源集合中該元素的索引。

copy() 方法的語法格式如下:
void copy(List <? super T> dest,List<? extends T> src)
其中,dest 表示目標集合對象,src 表示源集合對象。

注意:目標集合的長度至少和源集合的長度相同,如果目標集合的長度更長,則不影響目標集合中的其余元素。如果目標集合長度不夠而無法包含整個源集合元素,程序將拋出 IndexOutOfBoundsException 異常。

例 3

在一個集合中保存了 5 個商品名稱,現在要使用 Collections 類中的 copy() 方法將其中的 3 個替換掉。具體實現的代碼如下:
public class Test12
{
    public static void main(String[] args)
    {
        Scanner input=new Scanner(System.in);
        List srcList=new ArrayList();
        List destList=new ArrayList();
        destList.add("蘇打水");
        destList.add("木糖醇");
        destList.add("方便面");
        destList.add("火腿腸");
        destList.add("冰紅茶");
        System.out.println("原有商品如下:");
        for(int i=0;i<destList.size();i++)
        {
            System.out.println(destList.get(i));
        }
        System.out.println("輸入替換的商品名稱:");
        for(int i=0;i<3;i++)
        {
            System.out.println("第 "+(i+1)+" 個商品:");
            String name=input.next();
            srcList.add(name);
        }
        //調用copy()方法將當前商品信息復制到原有商品信息集合中
        Collections.copy(destList,srcList);
        System.out.println("當前商品有:");
        for(int i=0;i<destList.size();i++)
        {
            System.out.print(destList.get(i)+"\t");
        }
    }
}

如上述代碼,首先創建了兩個 List 對象 srcList 和 destList,并向 destList 集合中添加了 5 個元素,向 srcList 集合中添加了 3 個元素,然后調用 Collections 類中 copy() 方法將 srcList 集合中的全部元素復制到 destList 集合中。由于 destList 集合中含有 5 個元素,故最后兩個元素不會被覆蓋。

運行該程序,具體的執行結果如下所示。
原有商品如下:
蘇打水
木糖醇
方便面
火腿腸
冰紅茶
輸入替換的商品名稱:
第 1 個商品:
燕麥片
第 2 個商品:
八寶粥
第 3 個商品:
軟面包
當前商品有:
燕麥片    八寶粥軟面包    火腿腸    冰紅茶

填充

Collections 類的 fill() 靜態方法可以對指定集合的所有元素進行填充操作。fill() 方法的定義如下:
void fill(List<? super T> list,T obj)    //使用指定元素替換指定列表中的所有元素
其中,list 表示要替換的集合對象,obj 表示用來替換指定集合的元素值。

例 4

編寫一個程序,要求用戶輸入 3 個商品名稱,然后使用 Collections 類中的 fill() 方法對商品信息進行重置操作,即將所有名稱都更改為“未填寫”。具體的實現代碼如下:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Test13
{
    public static void main(String[] args)
    {
        Scanner input=new Scanner(System.in);
        List products=new ArrayList();
        System.out.println("******** 商品信息 ********");
        for(int i=0;i<3;i++)
        {
            System.out.println("請輸入第 "+(i+1)+" 個商品的名稱:");
            String name=input.next();
            products.add(name);    //將用戶錄入的商品名稱保存到List集合中
        }
        System.out.println("重置商品信息,將所有名稱都更改為'未填寫'");
        Collections.fill(products,"未填寫");
        System.out.println("重置后的商品信息為:");
        for(int i=0;i<products.size();i++)
        {
            System.out.print(products.get(i)+"\t");
        }
    }
}

如上述代碼,首先循環錄入 3 個商品名稱,并將這些商品信息存儲到 List 集合中,然后調用 Collections 類中的 fill() 方法將該集合中的所有元素值替換為“未填寫”。最后使用 for 循環將替換后的集合元素輸出。

運行該程序,執行結果如下所示。
******** 商品信息 ********
請輸入第 1 個商品的名稱:
蘇打水
請輸入第 2 個商品的名稱:
礦泉水
請輸入第 3 個商品的名稱:
冰紅茶
重置商品信息,將所有名稱都更改為'未填寫'
重置后的商品信息為:
未填寫    未填寫    未填寫    
< 上一頁Java Map集合 Java泛型下一頁 >

精美而實用的網站,提供C語言、C++、STL、Linux、Shell、Java、Go語言等教程,以及socket、GCC、vi、Swing、設計模式、JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo
极速pk10开户