Java基礎之數組(附帶Comparator)

文章目錄

    • 基礎概念
    • 可變參數組
    • 數組與List
    • Comparator類
      • 1,基本概念
      • 2,使用Comparator的靜態方法(Java 8+)
      • 3,常用Comparator方法
      • 4,例子
    • 排序與查找
    • 數組復制
    • 其他

基礎概念

int[] anArray = new int[10];

只有創建對象時才會使用new關鍵字,所以數組是個對象。

數組中的每個元素都會被初始化為默認值,int 類型的就為 0,Object 類型的就為 null。 不同數據類型的默認值不同

可變參數組

1. 基本概念

  • 定義:允許函數接受不確定數量的同類型參數,這些參數會被自動封裝為一個數組。
  • 作用:簡化方法調用,避免為不同參數數量重載多個方法。

2. 語法示例

public void printNumbers(int... numbers) {for (int num : numbers) {System.out.println(num);}
}// 調用方式
printNumbers(1, 2, 3);      // 輸出: 1 2 3
printNumbers(10, 20);       // 輸出: 10 20
printNumbers();            // 可以不傳參數

數組與List

將數組轉為List,使用Arrays類

//1
List<Integer> aList = Arrays.asList(1, 2, 3, 4, 5);
//2
int[] anArray = new int[] {1, 2, 3, 4, 5};
List<Integer> aList = Arrays.stream(anArray).boxed().collect(Collectors.toList());
  • .boxed()轉換為對應的包裝類對象。
  • **.collect(Collectors.toList())**此操作會把流中的元素收集到一個List集合中。

還有一個需要注意的是,Arrays.asList 方法返回的 ArrayList 并不是 java.util.ArrayList,它其實是 Arrays 類的一個內部類:

private static class ArrayList<E> extends AbstractList<E>implements RandomAccess, java.io.Serializable{}

如果需要添加元素或者刪除元素的話,需要把它轉成 java.util.ArrayList

new ArrayList<>(Arrays.asList(anArray));

Comparator類

1,基本概念

int compare(T o1, T o2)
返回值含義
負整數o1 應該排在 o2 前面 (o1 < o2)
o1 和 o2 相等 (o1 == o2)
正整數o1 應該排在 o2 后面 (o1 > o2)

因此

  • o1 - o2 → 升序排序
  • o2 - o1 → 降序排序
Comparator<String> lengthComparator = new Comparator<String>() {@Overridepublic int compare(String s1, String s2) {return s1.length() - s2.length();}
};
//使用Lamda
Comparator<String> lengthComparator = (s1, s2) -> s1.length() - s2.length();

2,使用Comparator的靜態方法(Java 8+)

// 按字符串長度排序
Comparator<String> lengthComparator = Comparator.comparingInt(String::length);// 按字符串長度降序排序
Comparator<String> descLengthComparator = Comparator.comparingInt(String::length).reversed();

3,常用Comparator方法

1. comparing() 和 comparingInt()/comparingLong()/comparingDouble()

// 按Person的age屬性排序
Comparator<Person> byAge = Comparator.comparing(Person::getAge);// 按字符串長度排序
Comparator<String> byLength = Comparator.comparingInt(String::length);
特性comparing()comparingInt()/comparingLong()/comparingDouble()
適用類型任何Comparable類型僅限基本數據類型(int/long/double)
性能可能有裝箱開銷無裝箱開銷,性能更好
方法參數FunctionToIntFunction/ToLongFunction/ToDoubleFunction
null處理需要額外處理需要額外處理
鏈式調用支持thenComparing()支持thenComparingInt()等對應方法

2. thenComparing() - 多級排序

// 先按age排序,age相同再按name排序
Comparator<Person> byAgeThenName = Comparator.comparingInt(Person::getAge).thenComparing(Person::getName);

3. naturalOrder() 和 reverseOrder()

// 自然順序排序
Comparator<String> natural = Comparator.naturalOrder();// 逆序排序
Comparator<String> reverse = Comparator.reverseOrder();

4. nullsFirst() 和 nullsLast() - 處理null值

// null值排在前面
Comparator<String> nullsFirst = Comparator.nullsFirst(Comparator.naturalOrder());// null值排在后面
Comparator<String> nullsLast = Comparator.nullsLast(Comparator.naturalOrder());

4,例子

----------------基本排序--------------
List<String> words = Arrays.asList("apple", "banana", "pear", "orange");// 按長度排序
words.sort(Comparator.comparingInt(String::length));
System.out.println(words); // [pear, apple, banana, orange]// 按長度降序
words.sort(Comparator.comparingInt(String::length).reversed());
System.out.println(words); // [banana, orange, apple, pear]
--------------對象排序-----------------
class Person {String name;int age;// 構造方法、getter、setter省略
}List<Person> people = Arrays.asList(new Person("Alice", 25),new Person("Bob", 30),new Person("Charlie", 20)
);// 按年齡排序
people.sort(Comparator.comparingInt(Person::getAge));
System.out.println(people); // [Charlie(20), Alice(25), Bob(30)]// 按年齡降序,然后按姓名升序
people.sort(Comparator.comparingInt(Person::getAge).reversed().thenComparing(Person::getName));
System.out.println(people); // [Bob(30), Alice(25), Charlie(20)]
-----------處理null值-------------
List<String> wordsWithNull = Arrays.asList("apple", null, "banana", null, "pear");// null值排在前面
wordsWithNull.sort(Comparator.nullsFirst(Comparator.naturalOrder()));
System.out.println(wordsWithNull); // [null, null, apple, banana, pear]// null值排在后面
wordsWithNull.sort(Comparator.nullsLast(Comparator.reverseOrder()));
System.out.println(wordsWithNull); // [pear, banana, apple, null, null]

排序與查找

  • Arrays.sort()方法。

  • 自定義排序(使用Comparator)

//本數據類型按照升序排列
int[] anArray = new int[] {5, 2, 1, 4, 8};
Arrays.sort(anArray);//自定義排序
//只對 1-3 位置上的元素進行反序,[A, Z, E, B, C]
String[] yetAnotherArray = new String[] {"A", "E", "Z", "B", "C"};
Arrays.sort(yetAnotherArray, 1, 3,Comparator.comparing(String::toString).reversed());
  • 二分查找,Arrays.binarySearch()
//保證數組已排序
int[] anArray = new int[] {1, 2, 3, 4, 5};
int index = Arrays.binarySearch(anArray, 4);

數組復制

// 復制整個數組(長度相同)
static int[] copyOf(int[] original, int newLength)// 復制數組的指定范圍
static int[] copyOfRange(int[] original, int from, int to)
------------例子-------------
int[] original = {1, 2, 3, 4, 5};
int[] copy = Arrays.copyOf(original, 3);  // [1, 2, 3]
int[] rangeCopy = Arrays.copyOfRange(original, 1, 4);  // [2, 3, 4]

其他

數組去重

int[] numbers = {1, 2, 2, 3, 4, 4, 4, 5};
Arrays.sort(numbers);int[] unique = Arrays.stream(numbers).distinct().toArray();
// 結果: [1, 2, 3, 4, 5]

數組填充

// 用指定值填充整個數組
static void fill(int[] a, int val)// 填充數組的指定范圍 [fromIndex, toIndex)
static void fill(int[] a, int fromIndex, int toIndex, int val)
--------------例子-----------
int[] numbers = new int[5];
Arrays.fill(numbers, 1);  // [1, 1, 1, 1, 1]// 部分填充
Arrays.fill(numbers, 1, 3, 9);  // [1, 9, 9, 1, 1]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907997.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907997.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907997.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Apache Doris 在數據倉庫中的作用與應用實踐

在當今數字化時代&#xff0c;企業數據呈爆炸式增長&#xff0c;數據倉庫作為企業數據管理和分析的核心基礎設施&#xff0c;其重要性不言而喻。而 Apache Doris&#xff0c;作為一款基于 MPP&#xff08;Massively Parallel Processing&#xff0c;大規模并行處理&#xff09;…

P1438 無聊的數列/P1253 扶蘇的問題

因為這兩天在寫線性代數的作業&#xff0c;沒怎么寫題…… P1438 無聊的數列 題目背景 無聊的 YYB 總喜歡搞出一些正常人無法搞出的東西。有一天&#xff0c;無聊的 YYB 想出了一道無聊的題&#xff1a;無聊的數列。。。 題目描述 維護一個數列 ai?&#xff0c;支持兩種操…

SpringBoot 自定義注解實現限流

SpringBoot 自定義注解實現限流 限流是為了防止服務器資源的過度消耗&#xff0c;通過一定的策略來控制訪問頻率&#xff0c;確保服務的高可用性和穩定性。其核心意義在于防止流量高峰時期接口過載&#xff0c;從而引起服務崩潰或響應延遲增加。本文將簡述如何通過AOP和自定義…

Unity——QFramework框架 內置工具

QFramework 除了提供了一套架構之外&#xff0c;QFramework 還提供了可以脫離架構使用的工具 TypeEventSystem、EasyEvent、BindableProperty、IOCContainer。 這些工具并不是有意提供&#xff0c;而是 QFramework 的架構在設計之初是通過這幾個工具組合使用而成的。 內置工具…

Vue3.5 企業級管理系統實戰(二十二):動態菜單

在前幾篇內容中已完成菜單、角色及菜單權限等相關開發&#xff0c;若要在左側菜單根據用戶角色動態展示菜單&#xff0c;需對 Sidebar 中的相關數據進行修改。鑒于其他相關方法及類型已在前文實現&#xff0c;本文不再重復闡述。 1 修改 Sidebar 組件 在 src/layout/componen…

014校園管理系統技術解析:構建智慧校園管理平臺

校園管理系統技術解析&#xff1a;構建智慧校園管理平臺 在教育信息化快速發展的當下&#xff0c;校園管理系統成為提升學校管理效率、優化校園服務的重要工具。該系統集成院校管理、投票管理等多個核心模塊&#xff0c;面向管理員、用戶和院內管理員三種角色&#xff0c;通過…

創新農業社會化服務 中和農信服務小農戶的探索實踐

在實現鄉村振興的道路上&#xff0c;如何讓現代農業發展成果惠及廣大小農戶&#xff0c;是一個重要課題。作為國內領先的綜合助農機構&#xff0c;中和農信多年來深耕農村市場&#xff0c;在服務小農戶方面進行了諸多創新探索&#xff0c;走出了一條具有示范意義的農業社會化服…

6.3 day 35

知識點回顧&#xff1a; 三種不同的模型可視化方法&#xff1a;推薦torchinfo打印summary權重分布可視化進度條功能&#xff1a;手動和自動寫法&#xff0c;讓打印結果更加美觀推理的寫法&#xff1a;評估模式 可視化 理解深度學習網絡最重要的2點&#xff1a; 1.了解損失如何定…

【如何在IntelliJ IDEA中新建Spring Boot項目(基于JDK 21 + Maven)】

AA. 我的開發環境配置與核心工具鏈解析 一、開發環境全覽 C:\Users\Again>java -version java version "21.0.1" 2023-10-17 LTS Java(TM) SE Runtime Environment (build 21.0.112-LTS-29) Java HotSpot(TM) 64-Bit Server VM (build 21.0.112-LTS-29, mixed m…

【C++高級主題】多重繼承下的類作用域

目錄 一、類作用域與名字查找規則&#xff1a;理解二義性的根源 1.1 類作用域的基本概念 1.2 單繼承的名字查找流程 1.3 多重繼承的名字查找特殊性 1.4 關鍵規則&#xff1a;“最近” 作用域優先&#xff0c;但多重繼承無 “最近” 二、多重繼承二義性的典型類型與代碼示…

登錄vmware vcenter報vSphere Client service has stopped working錯誤

一、問題 登錄vmware vcenter時發現報vSphere Client service has stopped working錯誤&#xff0c;導致vcenter控制臺進不去 二、解決辦法 打開vmware vcenter管理https://vcenterIP:5480&#xff0c;選擇VMware vSphere Client&#xff0c;重啟該服務后恢復正常。

MySQL關系型數據庫學習

學習參考鏈接&#xff1a;https://www.runoob.com/mysql/mysql-tutorial.html Windows 安裝MYSQL服務端的步驟&#xff1a;https://www.runoob.com/w3cnote/windows10-mysql-installer.html 1. 概念學習 MySQL 是一種關聯數據庫管理系統&#xff0c;關聯數據庫將數據保存在不…

web攻防之SSTI 注入漏洞

知識簡介 &#xff1a; 模版引擎和框架的區別 ssti的中文翻譯 &#xff1a; 服務端的模版的注入 模版引擎 &#xff1a;前端的用于裝飾優化html的模版 最簡單的就是在騰訊會議中的聊天功能 框架 &#xff1a; 這個是一套獨立存在的邏輯 如TP他是一個區別于php語法的后端邏輯…

【清晰教程】利用Git工具將本地項目push上傳至GitHub倉庫中

Git 是一個分布式版本控制系統&#xff0c;由 Linus Torvalds 創建&#xff0c;用于有效、高速地處理從小到大的項目版本管理。GitHub 是一個基于 Git 的代碼托管平臺&#xff0c;提供了額外的協作和社交功能&#xff0c;使項目管理更加高效。它們為項目代碼管理、團隊協作和持…

極簡以太彩光網絡解決方案4.0正式發布,“彩光”重構園區網絡極簡之道

5月28日下午,銳捷網絡在京舉辦以“光,本該如此‘簡單’”為主題的發布會,正式發布極簡以太彩光網絡解決方案4.0。作為“彩光”方案的全新進化版本,極簡以太彩光4.0從用戶需求出發,聚焦場景洞察,開啟了一場從底層基因出發的極簡革命,通過架構、部署、運維等多維度的創新升級,以強…

Selenium 中 JavaScript 點擊的優勢及使用場景

*在 Selenium 自動化測試中&#xff0c;使用 JavaScript 執行點擊操作&#xff08;如driver.execute_script("arguments[0].click();", element)&#xff09;相比直接調用element.click()有以下幾個主要優勢&#xff1a; 1. 繞過元素不可點擊的限制 問題場景&#x…

CppCon 2014 學習:Cross platform GUID association with types

類型的 GUID&#xff08;全局唯一標識符&#xff09; 是在 COM 編程&#xff08;Component Object Model&#xff09; 和某些大型 C 架構&#xff08;如 Office、DirectX、跨 DLL 接口&#xff09;中關聯類型信息和實現運行時類型識別與動態接口查詢的重要機制。 下面我們分層解…

Android 11以上App主動連接WIFI的完整方案

早期Android版本App內連接指定的WIFI還是比較簡單的&#xff0c;但是隨著Android版本的提升&#xff0c;限制也越來越多。以下是一套完整的Android 11以上的WIFI應用內主動連接方案。 第一步&#xff1a;添加到建議連接&#xff1a; val wifiManager getSystemService(WIFI_…

讓AI彈琴作曲不再是夢:Python+深度學習玩轉自動化音樂創作

讓AI彈琴作曲不再是夢:Python+深度學習玩轉自動化音樂創作 一、AI也能譜出動人的旋律?真不是科幻! 還記得小時候學鋼琴時老師的那句經典:“感覺不到情緒的樂句,是沒靈魂的。” 當時我一邊練琴一邊想:要是有個機器能幫我寫譜、調性又不跑調就好了! 結果幾年后,真被我碰…

機器學習:集成學習概念、分類、隨機森林

本文目錄&#xff1a; 一、集成學習概念**核心思想&#xff1a;** 二、集成學習分類&#xff08;一&#xff09;Bagging集成&#xff08;二&#xff09;Boosting集成(三&#xff09;兩種集成方法對比 三、隨機森林 一、集成學習概念 集成學習是一種通過結合多個基學習器&#…