最近中文字幕国语免费完整,中文亚洲无线码49vv,中文无码热在线视频,亚洲自偷自拍熟女另类,中文字幕高清av在线

當(dāng)前位置: 首頁(yè) > 開(kāi)發(fā)者資訊

java怎么刪除重復(fù)數(shù)字 java實(shí)現(xiàn)剔除重復(fù)數(shù)值的方法

  在 Java 開(kāi)發(fā)中,處理數(shù)據(jù)時(shí)經(jīng)常會(huì)遇到需要?jiǎng)h除重復(fù)數(shù)字的場(chǎng)景,比如從用戶(hù)輸入的數(shù)組中提取唯一數(shù)值、統(tǒng)計(jì)數(shù)據(jù)集中不重復(fù)的元素等。不同場(chǎng)景下,適合的實(shí)現(xiàn)方法有所差異,小編將介紹四種常用的 Java 剔除重復(fù)數(shù)值的方法,包括基于集合、數(shù)組遍歷、排序去重以及 Stream 流的實(shí)現(xiàn)方式,幫助開(kāi)發(fā)者根據(jù)實(shí)際需求選擇合適的方案。

  方法一:利用 Set 集合自動(dòng)去重(最簡(jiǎn)單高效)

  Set 集合是 Java 中的一種無(wú)序集合,其核心特性是 “不允許存儲(chǔ)重復(fù)元素”,因此可以直接利用這一特性實(shí)現(xiàn)重復(fù)數(shù)字的刪除。該方法無(wú)需手動(dòng)判斷元素是否重復(fù),代碼簡(jiǎn)潔,適合大多數(shù)基礎(chǔ)去重場(chǎng)景。

  實(shí)現(xiàn)步驟分為三步:首先將存儲(chǔ)數(shù)字的數(shù)組或列表轉(zhuǎn)換為 Set 集合,Set 會(huì)自動(dòng)過(guò)濾掉重復(fù)元素;然后根據(jù)需求將 Set 集合轉(zhuǎn)回?cái)?shù)組或列表;最后獲取去重后的結(jié)果。以 int 數(shù)組為例,具體代碼如下:

  java取消自動(dòng)換行復(fù)制

  若需要保持原始數(shù)組的元素順序,可將HashSet替換為L(zhǎng)inkedHashSet,LinkedHashSet會(huì)保留元素的插入順序,其他代碼邏輯不變。該方法的時(shí)間復(fù)雜度約為 O (n)(n 為元素?cái)?shù)量),效率較高,但 Set 集合無(wú)法直接存儲(chǔ)基本數(shù)據(jù)類(lèi)型,需使用包裝類(lèi)(如 Integer),不過(guò) Java 的自動(dòng)裝箱 / 拆箱機(jī)制會(huì)簡(jiǎn)化這一過(guò)程。

  方法二:數(shù)組遍歷手動(dòng)去重(適合基礎(chǔ)場(chǎng)景)

  若不希望依賴(lài)集合類(lèi),可通過(guò)數(shù)組遍歷的方式手動(dòng)判斷并剔除重復(fù)元素。該方法需要?jiǎng)?chuàng)建新數(shù)組存儲(chǔ)唯一元素,通過(guò)雙重循環(huán)對(duì)比元素是否重復(fù),適合對(duì)集合類(lèi)不熟悉或需自定義去重邏輯的場(chǎng)景。

  實(shí)現(xiàn)思路:先創(chuàng)建一個(gè)臨時(shí)列表(或新數(shù)組)存儲(chǔ)去重后的元素;遍歷原始數(shù)組,對(duì)每個(gè)元素,檢查它是否已存在于臨時(shí)列表中;若不存在,則添加到臨時(shí)列表,若已存在則跳過(guò);最后將臨時(shí)列表轉(zhuǎn)換為數(shù)組。代碼示例如下:

  java取消自動(dòng)換行復(fù)制

  該方法的優(yōu)點(diǎn)是邏輯直觀(guān),無(wú)需依賴(lài) Set 集合的特性,缺點(diǎn)是存在雙重循環(huán),時(shí)間復(fù)雜度為 O (n2),當(dāng)元素?cái)?shù)量較多(如超過(guò) 1000 個(gè))時(shí),效率會(huì)明顯下降,因此更適合小規(guī)模數(shù)據(jù)的去重。

  方法三:先排序再去重(適合需排序的場(chǎng)景)

  若業(yè)務(wù)中需要對(duì)數(shù)字進(jìn)行排序,可先通過(guò)排序算法將數(shù)組按升序或降序排列,排序后重復(fù)元素會(huì)相鄰排列,再通過(guò)一次遍歷即可刪除重復(fù)元素。該方法結(jié)合了排序與去重,適合既需去重又需排序的場(chǎng)景。

  實(shí)現(xiàn)步驟:首先使用Arrays.sort()對(duì)原始數(shù)組進(jìn)行排序;然后創(chuàng)建新數(shù)組或列表,遍歷排序后的數(shù)組,僅保留與前一個(gè)元素不同的元素(即跳過(guò)重復(fù)元素)。代碼示例如下:

  java取消自動(dòng)換行復(fù)制

  import java.util.Arrays;

  public class RemoveDuplicatesAfterSort {

  public static void main(String[] args) {

  int[] originalArray = {7, 2, 3, 2, 7, 5, 3, 8};

  // 1. 對(duì)數(shù)組排序(默認(rèn)升序)

  Arrays.sort(originalArray);

  // 2. 遍歷排序后的數(shù)組,去重

  // 臨時(shí)變量存儲(chǔ)去重后的元素個(gè)數(shù)

  int uniqueCount = 1;

  for (int i = 1; i < originalArray.length; i++) {

  // 若當(dāng)前元素與前一個(gè)元素不同,則為唯一元素

  if (originalArray[i] != originalArray[uniqueCount - 1]) {

  originalArray[uniqueCount] = originalArray[i];

  uniqueCount++;

  }

  }

  // 3. 截取數(shù)組,獲取去重后的結(jié)果

  int[] uniqueArray = Arrays.copyOf(originalArray, uniqueCount);

  // 輸出結(jié)果:[2, 3, 5, 7, 8](已排序且無(wú)重復(fù))

  System.out.println(Arrays.toString(uniqueArray));

  }

  }

  該方法的時(shí)間復(fù)雜度主要取決于排序步驟,Arrays.sort()采用的是雙軸快速排序算法,時(shí)間復(fù)雜度約為 O (n log n),后續(xù)遍歷去重的時(shí)間復(fù)雜度為 O (n),整體效率優(yōu)于手動(dòng)遍歷去重。但缺點(diǎn)是會(huì)改變?cè)紨?shù)組的順序(轉(zhuǎn)為排序后的順序),若需保留原始順序則不適用。

java2.jpg

  方法四:使用 Stream 流去重(Java 8 及以上,代碼最簡(jiǎn)潔)

  Java 8 引入的 Stream 流提供了便捷的數(shù)據(jù)處理能力,通過(guò)distinct()方法可直接實(shí)現(xiàn)元素去重,配合collect()方法還能將結(jié)果轉(zhuǎn)換為數(shù)組或列表,代碼簡(jiǎn)潔且可讀性高,適合 Java 8 及以上版本的開(kāi)發(fā)場(chǎng)景

  實(shí)現(xiàn)步驟:將數(shù)組或集合轉(zhuǎn)換為 Stream 流;調(diào)用distinct()方法去重;通過(guò)collect()將流轉(zhuǎn)換為目標(biāo)數(shù)據(jù)結(jié)構(gòu)(如 List),若需數(shù)組則進(jìn)一步轉(zhuǎn)換。代碼示例如下:

  j取消自動(dòng)換行復(fù)制

  import java.util.Arrays;

  import java.util.List;

  import java.util.stream.Collectors;

  public class RemoveDuplicatesWithStream {

  public static void main(String[] args) {

  int[] originalArray = {6, 3, 8, 3, 6, 2, 9, 2};

  // 1. 數(shù)組轉(zhuǎn)Stream流,去重后轉(zhuǎn)為L(zhǎng)ist

  List<Integer> uniqueList = Arrays.stream(originalArray)

  .boxed() // 基本類(lèi)型轉(zhuǎn)包裝類(lèi)

  .distinct() // 去重

  .collect(Collectors.toList());

  // 2. 若需數(shù)組,可從List轉(zhuǎn)換

  int[] uniqueArray = uniqueList.stream()

  .mapToInt(Integer::intValue)

  .toArray();

  // 輸出結(jié)果:[6, 3, 8, 2, 9](Stream流默認(rèn)順序與原始數(shù)組一致)

  System.out.println(Arrays.toString(uniqueArray));

  }

  }

  該方法的優(yōu)點(diǎn)是代碼簡(jiǎn)潔,一行鏈?zhǔn)秸{(diào)用即可完成去重,且distinct()方法內(nèi)部通過(guò)LinkedHashSet實(shí)現(xiàn),能保留元素的原始順序,時(shí)間復(fù)雜度約為 O (n)。但需注意,該方法依賴(lài) Java 8 及以上版本,且對(duì)于大規(guī)模數(shù)據(jù),Stream 流的性能與 Set 集合相近,適合追求代碼簡(jiǎn)潔性的場(chǎng)景。

  四種方法各有優(yōu)缺點(diǎn),實(shí)際開(kāi)發(fā)中需根據(jù)場(chǎng)景選擇:若需簡(jiǎn)單高效且不依賴(lài)版本,優(yōu)先選擇 Set 集合去重;若需保留原始順序且使用 Java 8+,推薦 Stream 流;若需同時(shí)排序,可采用先排序再去重的方式;若對(duì)集合類(lèi)不熟悉或數(shù)據(jù)量小,手動(dòng)遍歷去重更易理解。無(wú)論選擇哪種方法,核心思路都是通過(guò) “判斷元素唯一性” 實(shí)現(xiàn)去重,開(kāi)發(fā)者可根據(jù)數(shù)據(jù)規(guī)模、版本要求及順序需求靈活選擇。

 


猜你喜歡