Java數據結構 - 順序表模擬實現與使用

目錄

  • 1.順序表的基本介紹
  • 2.順序表的模擬實現
    • 2.1 常見的功能
    • 2.2 基本框架
    • 2.3 方法的實現
      • 2.3.1 add方法
      • 2.3.2 size方法
      • 2.3.3 display方法
      • 2.3.4 add(int pos,E data)方法
      • 2.3.5 remove方法
      • 2.3.6 get方法
      • 2.3.7 contain方法
      • 2.3.8 indexOf方法
      • 2.3.9 set方法
      • 2.3.10 clear方法
    • 2.4方法的使用
  • 3.順序表的應用
    • 3.1 創建卡牌
    • 3.2 牌的實現
    • 3.3 發牌
  • 4.代碼鏈接

1.順序表的基本介紹

順序表在內存中的存儲是連續的,它是線性表中的其中一種,使用順序表可以對數據進行增刪查改。

2.順序表的模擬實現

2.1 常見的功能

// 新增元素,默認在數組最后新增
public void add(E data) { }
// 在 pos 位置新增元素
public void add(int pos, E data) { }
// 判定是否包含某個元素
public boolean contains(E toFind) { return true; }
// 查找某個元素對應的位置
public int indexOf(int toFind) { return -1; }
// 獲取 pos 位置的元素
public E get(int pos) { return null; }
// 給 pos 位置的元素設為 value
public void set(int pos, E value) { }
//刪除第?次出現的關鍵字key
public void remove(E toRemove) { }
// 獲取順序表?度
public int size() { return 0; }
// 清空順序表
public void clear() { }
// 打印順序表,注意:該?法并不是順序表中的?法,為了?便看測試結果給出的
public void display() { }

2.2 基本框架

順序表在內存中的存儲是連續的,可以理解為順序表在底層存放類似于數組的存放,所以在模擬實現時要定義一個數組,在增刪除查改的過程中數據的實際存儲會變化,可以再定義一個變量統計實際順序表中存儲的元素個數。

//順序表
public class myArrayList<E> {public Object[] arrays;//存放數據public int usedSize;//統計個數public static int initialCapacity = 5;//默認容量public myArrayList(){//創建同時定義大小arrays = new Object[initialCapacity];}//方法// 新增元素,默認在數組最后新增public void add(E data) { }// 在 pos 位置新增元素public void add(int pos, E data) { }// 判定是否包含某個元素public boolean contains(int toFind) { return true; }// 查找某個元素對應的位置public int indexOf(E toFind) { return -1; }// 獲取 pos 位置的元素public E get(int pos) { return null; }// 給 pos 位置的元素設為 valuepublic void set(int pos, E value) { }//刪除第?次出現的關鍵字keypublic void remove(int toRemove) { }// 獲取順序表?度public int size() { return 0; }// 清空順序表public void clear() { }// 打印順序表,注意:該?法并不是順序表中的?法,為了?便看測試結果給出的public void display() { }
}

2.3 方法的實現

2.3.1 add方法

 private void add_capacity(Object[] arrays){//二倍擴容arrays = Arrays.copyOf(arrays,arrays.length * 2);}// 新增元素,默認在數組最后新增public void add(E data) { //1.添加元素前需要判斷是否容量是否未滿if(usedSize == arrays.length){//如果容量已滿擴容add_capacity(arrays);}//2.增加元素arrays[usedSize] = data;usedSize++;//下次增加的下標}

2.3.2 size方法

// 獲取順序表?度public int size() { //返回usedSize,實際使用的長度return usedSize;}

2.3.3 display方法

// 打印順序表,注意:該?法并不是順序表中的?法,為了?便看測試結果給出的public void display() {//1.判斷是否為空if(usedSize == 0){return;//無需打印}//2.打印for (int i = 0; i < arrays.length; i++) {System.out.print(arrays[i] + " ");}}

2.3.4 add(int pos,E data)方法


public class PosillegalException extends RuntimeException{public PosillegalException() {}public PosillegalException(String message) {super(message);}
}
 // 在 pos 位置新增元素public void add(int pos, E data) {//1.判斷是否需要擴容if(usedSize == arrays.length){add_capacity(arrays);}//2.坐標的使用需要判斷是否合法if(pos < 0 || pos > usedSize){throw new PosillegalException("坐標非法:" + pos);}//3.增加:將pos位置后面的元素往后移動,再增加for (int i = usedSize - 1;i <= pos;i--){arrays[usedSize] = arrays[usedSize + 1];}arrays[pos] = data;usedSize++;//元素+1}

2.3.5 remove方法

 //刪除第?次出現的關鍵字keyprivate int search(E toRemove){for (int i = 0; i < arrays.length; i++) {if(arrays[i] == toRemove){return i;}}return -1;}public void remove(E toRemove) {//1.遍歷數組查詢是否存在int pos = search(toRemove)if (pos == -1) {System.out.println(toRemove + "不存在該元素!");return;}//2.在指定下標開始,從前往后覆蓋for (int i = pos; i < usedSize - 1; i++) {arrays[i] = arrays[i + 1];}//3.元素減一usedSize--;}

2.3.6 get方法

// 獲取 pos 位置的元素public E get(int pos) { //1.判斷坐標是否合法if(pos < 0 || pos >= usedSize){throw new PosillegalException("坐標非法:" + pos);}//2.返回return (E)arrays[pos]; }

2.3.7 contain方法

    // 判定是否包含某個元素public boolean contains(E toFind) {//1.判斷是否為空if(usedSize == 0) return false;//2.調用search方法int pos = search(toFind);//3.判斷if(pos == -1) return false;else return true;}

2.3.8 indexOf方法

 // 查找某個元素對應的位置private boolean isEmpty(){return usedSize == 0;}public int indexOf(E toFind) { //1.判斷是否為空if(isEmpty()) return -1;//2.使用searchreturn search(toFind);}

2.3.9 set方法

   // 給 pos 位置的元素設為 valuepublic void set(int pos, E value) {//1.判斷坐標是否合法if(pos < 0 || pos >= usedSize){throw new PosillegalException("坐標非法:"+ pos);}//2.考慮是否擴容if(usedSize == arrays.length){add_capacity(arrays);}//3.設置arrays[pos] = value;}

2.3.10 clear方法

 // 清空順序表public void clear() {//數組中的元素是E類型(泛型),有可能是引用數據類型//需要將元素設置為nullfor (int i = 0; i < usedSize; i++) {arrays[i] = null;}//將數組引用設置為nullarrays = null;}

2.4方法的使用

public class Main{public static void main(String[] args) {myArrayList<Integer> myArrayList = new myArrayList<>();myArrayList.add(1);//增加myArrayList.add(1,2);myArrayList.display();//展示System.out.println("=====");myArrayList.remove(2);//移除myArrayList.set(0,3);//設置boolean ret = myArrayList.contains(1);//查詢是否包含System.out.println(ret);int pos = myArrayList.indexOf(0);//查找位置System.out.println(pos);int e = myArrayList.get(0);//獲取System.out.println(e);myArrayList.clear();//回收順序表myArrayList.display();}
}

在這里插入圖片描述

3.順序表的應用

順序表是連續存儲的一塊內存空間,在游戲中使用比較廣泛,利用順序表可以實現簡單的洗牌算法

3.1 創建卡牌

//牌
public class Card {public int rank;//牌值public String suit;//花色//重寫toString方法@Overridepublic String toString() {return  String.format("%s %d",suit,rank);}
}

3.2 牌的實現

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;/**/
public class CardDemo {//花色public static String[] Suit = {"?","?","?","?"};//使用順序表實現一副牌(不包含大小王)public List<Card> buyDeck(){List<Card> deck = new ArrayList<>(52);for (int i = 0; i < 4; i++) {//花色for (int j = 1; j <= 13; j++) {//牌值String suit = Suit[i];int rank = j;Card card = new Card();card.suit = suit;card.rank = rank;deck.add(card);}}return deck;}//打亂順序:生成隨機坐標,與指定坐標交換private static void swap(List<Card> deck,int i,int j ){Card card = deck.get(i);deck.set(i,deck.get(j));deck.set(j,card);}private static List<Card> shuffle(List<Card> deck){Random random = new Random();int j = random.nextInt(52);//0 - 51for (int i = deck.size() - 1; i >= 0 ; i--) {swap(deck,i,j);}return deck;}}

簡單測試實現的排序

 public static void main(String[] args) {CardDemo cardDemo = new CardDemo();List<Card> deck = cardDemo.buyDeck();System.out.println(deck);//洗牌前deck = CardDemo.shuffle(deck);System.out.println(deck);//洗牌后}

在這里插入圖片描述

3.3 發牌

 public static void main(String[] args) {CardDemo cardDemo = new CardDemo();List<Card> deck = cardDemo.buyDeck();System.out.println(deck);//洗牌前deck = CardDemo.shuffle(deck);System.out.println(deck);//洗牌后List<List<Card>> hand = new ArrayList<>();hand.add(new ArrayList<>());hand.add(new ArrayList<>());hand.add(new ArrayList<>());//發牌:一共發5輪,一輪每人發一張for (int i = 0; i < 5; i++) {for (int j = 0; j < 3; j++) {hand.get(j).add(deck.remove(0));}}//第一個人的牌System.out.println(hand.get(0));//第二個人的牌System.out.println(hand.get(1));//第三個人的牌System.out.println(hand.get(2));//剩余的牌System.out.println(deck);}}

在這里插入圖片描述

4.代碼鏈接

順序表的使用

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

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

相關文章

rust語言 (1.88) egui (0.32.1) 學習筆記(逐行注釋)(二十六)windows平臺運行時隱藏控制臺

1、主程序第一句添加&#xff1a; 必須放在所有代碼第一句 #![cfg_attr(windows, windows_subsystem "windows")]2、 編譯命令&#xff1a;cargo build --release3、 編譯完成后運行可執行文件&#xff1a; 項目目錄/target/release/項目名.exe

什么是靜態住宅IP 跨境電商為什么要用靜態住宅IP

靜態住宅IP的定義靜態住宅IP是指由互聯網服務提供商&#xff08;ISP&#xff09;分配給家庭用戶的固定IP地址。與動態IP不同&#xff0c;靜態IP不會頻繁變動&#xff0c;長期保持穩定。其特點包括&#xff1a;固定性&#xff1a;IP地址長期不變&#xff0c;適合需要穩定網絡環境…

RabbitMQ 初步認識

目錄 1. 基本概念 2. RabbitMq 的工作流程 3. 協議 4. 簡單的生產者, 消費者模型 4.1 我們先引入 rabbitmq 的依賴 4.2 生產者 4.3 消費者 1. 基本概念 Pruducer : 生產者, 產生消息Consumer : 消費者, 消費消息Broker : RabbitMq Server, 用來接收和發送消息Connectio…

Redis(46) 如何搭建Redis哨兵?

搭建 Redis 哨兵&#xff08;Sentinel&#xff09;集群&#xff0c;確保 Redis 服務具有高可用性。以下是詳細的步驟&#xff0c;從 Redis 安裝、配置主從復制到配置和啟動 Sentinel 集群&#xff0c;并結合相關的代碼示例。 步驟 1&#xff1a;安裝 Redis 首先&#xff0c;需要…

Grafana 多指標相乘

PromQL中多指標相乘 PromQL表達式&#xff1a; 0.045 * h9_daily_income{coin"nock"} * h9_pool_price_cny{coin"nock"}&#x1f4c8; 基礎&#xff1a;單指標運算 常數與指標相乘 在PromQL中&#xff0c;常數與指標的乘法是最簡單的運算&#xff1a; # ?…

【微服務】springboot3 集成 Flink CDC 1.17 實現mysql數據同步

目錄 一、前言 二、常用的數據同步解決方案 2.1 為什么需要數據同步 2.2 常用的數據同步方案 2.2.1 Debezium 2.2.2 DataX 2.2.3 Canal 2.2.4 Sqoop 2.2.5 Kettle 2.2.6 Flink CDC 三、Flink CDC介紹 3.1 Flink CDC 概述 3.1.1 Flink CDC 工作原理 3.2 Flink CDC…

分布式數據架構

分布式數據架構是一種將數據分散存儲在多臺獨立計算機&#xff08;節點&#xff09;上&#xff0c;并通過網絡協調工作的系統設計。其核心目標是解決海量數據處理、高并發訪問、高可用性及可擴展性等傳統集中式數據庫難以應對的挑戰。以下是關鍵要點解析&#xff1a;一、核心原…

Spark 中spark.implicits._ 中的 toDF和DataFrame 類本身的 toDF 方法

1. spark.implicits._ 中的 toDF&#xff08;隱式轉換方法&#xff09;本質這是一個隱式轉換&#xff08;implicit conversion&#xff09;&#xff0c;通過 import spark.implicits._ 被引入到作用域中。它的作用是為本地 Scala 集合&#xff08;如 Seq, List, Array 等&#…

如何在MacOS上卸載并且重新安裝Homebrew

Homebrew是一款針對macOS操作系統的包管理工具&#xff0c;它允許用戶通過命令行界面輕松安裝、升級和管理各種開源軟件包和工具。Homebrew是一個非常流行的工具&#xff0c;用于簡化macOS系統上的軟件安裝和管理過程。一、卸載 Homebrew方法1&#xff1a;官方卸載腳本&#xf…

如何簡單理解狀態機、流程圖和時序圖

狀態機、流程圖和時序圖都是軟件工程中用來描述系統行為的工具&#xff0c;但它們像不同的“眼鏡”一樣&#xff0c;幫助我們從不同角度看問題。下面用生活比喻來簡單理解思路&#xff1a;狀態機&#xff1a;想象一個交通信號燈。它總是在“紅燈”“黃燈”“綠燈”這些狀態之間…

消失的6個月!

已經6個月沒有更新了 四個月的研一下生活 兩個月暑假&#xff0c;哈哈&#xff0c;其實也沒閑著。每天都有好好的學習&#xff0c;每天學習時長6h 暑假按照導師的指示開始搞項目了&#xff0c;項目是關于RAG那塊中的應用場景&#xff0c;簡單來說就是deepseek puls ,使用大…

Android開發——初步學習Activity:什么是Activity

Android開發——初步學習Activity&#xff1a;什么是Activity ? 在 Android 中&#xff0c;Activity 是一個用于展示用戶界面的組件。每個 Activity 通常對應應用中的一個屏幕&#xff0c;例如主界面、設置界面或詳情頁。Activity 負責處理用戶的輸入事件&#xff0c;更新 UI&…

【左程云算法03】對數器算法和數據結構大致分類

目錄 對數器的實現 代碼實現與解析 1. 隨機樣本生成器 (randomArray) 2. 核心驅動邏輯 (main 方法) 3. 輔助函數 (copyArray 和 sameArray) 對數器的威力 算法和數據結構簡介?編輯 1. 硬計算類算法 (Hard Computing) 2. 軟計算類算法 (Soft Computing) 核心觀點 一個…

MATLAB | 繪圖復刻(二十三)| Nature同款雷達圖

Hello 真的好久不見&#xff0c;這期畫一個Nature同款雷達圖&#xff0c;原圖是下圖中的i圖&#xff0c;長這樣&#xff1a; 本圖出自&#xff1a; Pan, X., Li, X., Dong, L. et al. Tumour vasculature at single-cell resolution. Nature 632, 429–436 (2024). https://d…

React Hooks UseCallback

開發環境&#xff1a;React Native Taro TypescriptuseCallback的用途&#xff0c;主要用于性能優化&#xff1a;1 避免不必要的子組件重渲染&#xff1a;當父組件重渲染時&#xff0c;如果傳遞給子組件的函數每次都是新創建的&#xff0c;即使子組件使用了 React.memo&#…

使用SD為VFX制作貼圖

1.制作遮罩 Gradient Linear 1 通過Blend 可以混合出不同遮罩 2.徑向漸變 Shape 節點 , 非常常用 色階調節灰度和漸變過渡 曲線能更細致調節灰度 色階還可以反向 和圓盤混合 就是 菲涅爾Fresnel 3. 屏幕后處理漸變 第二種方法 4. 極坐標 Gradient Circular Threshold 閾值節…

面經分享二:Kafka、RabbitMQ 、RocketMQ 這三中消息中間件實現原理、區別與適用場景

一、實現原理 (Implementation Principle) 1. Apache Kafka&#xff1a;分布式提交日志 (Distributed Commit Log) Kafka 的核心設計理念是作為一個分布式、高吞吐量的提交日志系統。它不追求消息的復雜路由&#xff0c;而是追求數據的快速、持久化流動。 存儲結構&#xff1a;…

Android開發——初步了解AndroidManifest.xml

Android開發——初步了解AndroidManifest.xml ? AndroidManifest.xml 是 Android 應用的清單文件&#xff0c;包含了應用的包名、組件聲明、權限聲明、API 版本信息等。它是 Android 應用的“說明書”&#xff0c;系統通過它了解應用的結構和行為。咱們的AndroidManifest文件實…

ecplise配置maven插件

1.下載maven 2.配置系統變量 MAVEN_HOME&#xff1a; E:\CODE\MAVEN\apache-maven-3.0.4 3.配置環境變量 %MAVEN_HOME%\bin 4.cmd&#xff1a;mvn -version 注1 如圖所示為&#xff1a;成功 注1&#xff1a;配置成功的前提是要有配置JAVA_HOME,如果沒有配置&#xff0c;則…

Vue 項目性能優化實戰

性能優化有一套「發現 → 定位 → 解決」的閉環方法論。本文以真實項目為藍本&#xff0c;從編碼階段到上線監控&#xff0c;給出一條可落地的 Vue 性能優化路線圖。 一、量化指標定位性能瓶頸 任何優化之前先用量化證據鎖死問題。 Lighthouse 一鍵跑分&#xff1a;首屏、交互、…