您好,登錄后才能下訂單哦!
小編給大家分享一下基于Arrays.sort()和lambda表達式如何實現,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
數字排序:
int[] intArray = new int[]{1,34,5,-9}; Arrays.sort(intArray); System.out.println(Arrays.toString(intArray));
字符串排序(先大寫后小寫):
String[] strArray = new String[]{"Z", "a", "D"}; Arrays.sort(strArray); System.out.println(Arrays.toString(strArray));
字符串排序(忽略大小寫):
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
反向排序:
Arrays.sort(strArray, Collections.reverseOrder());
注意:Arrays.sort()使用的是雙軸快排:
1.對于很小的數組(長度小于27),會使用插入排序。
2.選擇兩個點P1,P2作為軸心,比如我們可以使用第一個元素和最后一個元素。
3.P1必須比P2要小,否則將這兩個元素交換,現在將整個數組分為四部分:
(1)第一部分:比P1小的元素。
(2)第二部分:比P1大但是比P2小的元素。
(3)第三部分:比P2大的元素。
(4)第四部分:尚未比較的部分。
在開始比較前,除了軸點,其余元素幾乎都在第四部分,直到比較完之后第四部分沒有元素。
4.從第四部分選出一個元素a[K],與兩個軸心比較,然后放到第一二三部分中的一個。
5.移動L,K,G指向。
6.重復 4 5 步,直到第四部分沒有元素。
7.將P1與第一部分的最后一個元素交換。將P2與第三部分的第一個元素交換。
8.遞歸的將第一二三部分排序。
對于基本類型的數組如int[], double[], char[] ,Arrays類只提供了默認的升序排列,沒有降序,需要傳入自定義比較器,使用Arrays.sort(num,c),傳入一個實現了Comparator接口的類的對象c。逆序排列:
Arrays.sort(num,new Comparator<Integer>(){ public int compare(Integer a, Integer b){ return b-a; } });
Arrays的其他方法:
Arrays.sort(num, fromIndex, toIndex);
給某區間排序。
Arrays.sort(num, fromIndex, toIndex,c);
給某區間按c比較器排序。
要先Comparable接口或Comparator接口。
兩種比較器的對比:
內部比較器: 需要比較的對象必須實現Comparable接口,并重寫compareTo(T o)方法,表明該對象可以用來排序,否則不能直接使用Arrays.sort()方法。
public class Employee implements Comparable<Employee> { private int id;// 員工編號 private double salary;// 員工薪資 public int getId() { return id; } public void setId(int id) { this.id = id; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public Employee(int id, double salary) { super(); this.id = id; this.salary = salary; } // 為了輸出方便,重寫toString方法 @Override public String toString() { // 簡單輸出信息 return "id:"+ id + ",salary=" + salary; } // 比較此對象與指定對象的順序 @Override public int compareTo(Employee o) { // 比較員工編號,如果此對象的編號大于、等于、小于指定對象,則返回1、0、-1 int result = this.id > o.id ? 1 : (this.id == o.id ? 0 : -1); // 如果編號相等,則比較薪資 if (result == 0) { // 比較員工薪資,如果此對象的薪資大于、等于、小于指定對象,則返回1、0、-1 result = this.salary > o.salary ? 1 : (this.salary == o.salary ? 0 : -1); } return result; } }
外部比較器: 需要自己寫一個比較器實現Comparator接口,并實現compare(T o1, T o2)方法,根據自己的需求定義比較規則。使用外部比較器這種方式比較靈活,例如現在需求是按照員工編號和薪資進行排序,以后可能按照姓名進行排序,這時只要再寫一個按照姓名規則比較的比較器就可以了。
/** * 測試兩種比較器 * @author Sam * */ public class TestEmployeeCompare { /** * @param args */ public static void main(String[] args) { List<Employee> employees = new ArrayList<Employee>(); employees.add(new Employee(2, 5000)); employees.add(new Employee(1, 4500)); employees.add(new Employee(4, 3500)); employees.add(new Employee(5, 3000)); employees.add(new Employee(4, 4000)); // 內部比較器:要排序的對象要求實現了Comparable接口 ,直接傳入該對象即可 Arrays.sort(employees); System.out.println("通過內部比較器實現:"); System.out.println(employees); List<Employee> employees2 = new ArrayList<Employee>(); employees2.add(new Employee(2, 5000)); employees2.add(new Employee(1, 4500)); employees2.add(new Employee(4, 3500)); employees2.add(new Employee(5, 3000)); employees2.add(new Employee(4, 4000)); // 外部比較器:自定義類實現Comparator接口 ,需要傳入自定義比較器類 Arrays.sort(employees2, new EmployeeComparable()); System.out.println("通過外部比較器實現:"); System.out.println(employees2); } } /** * 自定義員工比較器 * */ class EmployeeComparable implements Comparator<Employee> { @Override public int compare(Employee o1, Employee o2) { // 比較員工編號,如果此對象的編號大于、等于、小于指定對象,則返回1、0、-1 int result = o1.getId() > o2.getId() ? 1 : (o1.getId() == o2.getId() ? 0 : -1); // 如果編號相等,則比較薪資 if (result == 0) { // 比較員工薪資,如果此對象的薪資大于、等于、小于指定對象,則返回1、0、-1 result = o1.getSalary() > o2.getSalary() ? 1 : (o1.getSalary() == o2.getSalary() ? 0 : -1); } return result; } }
最后巧用lambda表達式:(參數) -> 一個表達式或一段代碼
如:
實現逆序:
Arrays.sort(nums, ( Integer a, Integer b) -> { return b-a;});
字符串數組,按長度排序:
Arrays.sort(strs, (String first, String second) -> { if(first.length() < second.length()) return -1; else if(first.length() > second.length()) return 1; else return 0; });
先寫一個Person類,主要有address跟name兩個成員屬性以及他們的getter()方法,最后補刀重寫toString()方法
public class Person { private String address; private String name; public Person(String firstName, String lastName) { this.address = firstName; this.name = lastName; } public String getAddress() { return address; } public String getName() { return name; } @Override public String toString() { return getClass().getSimpleName()+"{" + "address='" + address + '\'' + ", name='" + name + '\'' + '}'; } }
以前寫比較排序的時候,總需要寫一大堆代碼,比如下面:
public class TestCh06 { public static void main(String... args) throws CloneNotSupportedException { //定義一個Person類數組 Person[] arr = {new Person("wo", "2722"), new Person("uj", "2829"), new Person("dh", "272"), new Person("us", "1"), new Person("jaka", "881711")}; LenComparator lc = new LenComparator(); //排序 Arrays.sort(arr, lc); System.out.println(Arrays.toString(arr)); } } /** * 按照名字長度來排序的比較器-->主要用于String類型的數組 */ class LenComparator implements Comparator<Person> { @Override public int compare(Person o1, Person o2) { return Integer.compare(o1.getName().length(), o2.getName().length()); } }
如今Java8SE出來了很久了,如果還使用上面的代碼寫作確實有點缺優雅,因為Comparator接口包含了很多方便的靜態方法類創建比較器(這些方法可以用于lambda表達式或者方法引用)
//按照名字進行排序 Arrays.sort(arr, Comparator.comparing(Person::getName)); //按照名字長度進行排序 Arrays.sort(arr,Comparator.comparing(Person::getName,(s,t)->Integer.compare(s.length(),t.length()))); Arrays.sort(arr,Comparator.comparingInt(p->p.getName().length())); //先按照名字進行排序,如果名字相同,再按照地址比較 Arrays.sort(arr,Comparator.comparing(Person::getName).thenComparing(Person::getAddress));
以上是“基于Arrays.sort()和lambda表達式如何實現”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。