データ構造の実装-配列の実装

序文

海から学び、一生懸命働く

データ構造を知っていますが、データ構造の特定の実装はあまり明確ではありませんか?

今日から、使い慣れたJava言語でデータ構造をゆっくりと実装します


データ構造

データ構造とは何ですか?

データ構造は、コンピューターがデータを格納および編成するための方法であり、それらの間に1つ以上の特定の関係を持つデータ要素のコレクションを指します

データ構造の役割

データ構造はデータを格納および編成する方法であるため、次の関数が必要です

  1. データを挿入する機能
  2. 特定のデータを見つける能力
  3. 特定のデータを削除する機能
  4. 他の操作のためにすべてのデータにアクセスする機能

一般的なデータ構造

ここに画像の説明を挿入

ここに画像の説明を挿入

これらのデータ構造には独自の特性があります。次回は、Javaを介してゆっくりと実装してください

最も単純な配列から始めます


配列の知識

配列は、同じデータ型のコレクションを格納するために使用されます

配列を宣言する

Javaで配列を宣言するには2つの方法があります

(1)

数据类型[] 数组名 = new 数据类型[数组长度];
int[] num = new int[5];

注:[]は配列名の前と後ろを置くことができますが、前を置くほうが標準化されているため、これが配列であることを示すことができます。
注:配列の正確なサイズを制限する必要があります

(2)

数据类型[] 数组名 = {"数组元素1”,"数组元素2"...}
int[] array = {1,2,3}

注:配列のサイズは、指定された配列の要素数によって決まります

配列要素にアクセスする

配列には、0から配列の長さ-1までの添字インデックスがあります。

配列にアクセスするときは、添え字でアクセスできます

配列への割り当ても、添え字によって配列内の位置に割り当てる必要があります(ただし、境界を超えてはなりません)。

//初始化
int[] num = new int[3];
//赋值
num[0]= 1;
//访问第一个数据
System.out.println(num[0]);

ここに画像の説明を挿入

num[3]= 4;

範囲外エラー:ArrayIndexOutOfBoundsException
ここに画像の説明を挿入

配列トラバーサル

配列は、配列の長さを示す長さプロパティを提供します

次に、トラバーサル方法を選択します:for、foreach、イテレータが配列をトラバースします

int[] a = new int[3];
System.out.println(a.length);

配列を実装する

アレイの性質は以前に示されています

Java配列を介してデータ構造をシミュレートするには、次の機能を実現したいと考えています

  1. データを挿入する(添え字の値が渡されるかどうか)
  2. 下付き文字に基づいてデータを検索する
  3. 下付き文字に基づいてデータを削除する
  4. トラバースする長さプロパティを提供する
  5. 値を変更

以下は、int配列のデータ構造の簡単な実装であり、繰り返し要素を考慮していません

public class MyArray {
    //定义一个数组
    private int[] intArray;
    //数组实际长度
    private int realLength;
    //数组最大长度
    private int length;
    //构造一个数组
    public MyArray(int arrayLength){
        realLength = 0;
        length = arrayLength;
        intArray = new int[length];
    }
    //获得数组真实长度
    public int size(){
        return realLength;
    }
    //添加元素,返回成功与否
    public boolean add(int value){
        //数组满了
        if (realLength == length){
            System.out.println("数组满了,添加失败");
            return false;
        }
        else {
            //默认往数组尾添加数据
            intArray[realLength] = value;
            //真实长度+1
            realLength++;
        }
        return true;
    }
    //根据下标添加元素,返回成功与否
    public boolean add(int index,int value){
        //数组满了
        if (realLength == length){
            System.out.println("数组满了,添加失败");
            return false;
        }
        //越界
        if (index < 0 && index > length - 1){
            throw new ArrayIndexOutOfBoundsException();
        }
        //如果是替换
        if (index < realLength) {
            intArray[index] = value;
        }
        //如果是添加
        else {
            intArray[index] = value;
            realLength++;
        }
        return true;
    }
    //根据下标获取元素
    public int get(int index){
        //越界
        if (index < 0 && index > realLength - 1){
            throw new ArrayIndexOutOfBoundsException();
        }
        return intArray[index];
    }
    //遍历显示
    public void show(){
        for (int i : intArray){
            System.out.print(i+" ");
        }
    }
    //根据元素查找元素下标
    public int find(int value){
        int index = -1;
        for (int i = 0 ; i < realLength ; i++){
            if (i == value){
                index = i;
                break;
            }
        }
        return index;
    }
    //根据具体元素值删除元素
    public boolean delete(int value){
        //先查找该元素的下标
        int index = find(value);
        //如果没找到
        if (index == -1){
            return false;
        }
        else {
            deleteMethod(index);
            return true;
        }
    }
    //根据下标删除元素
    public boolean deleteByIndex(int index){
        //越界
        if (index < 0 && index > realLength - 1){
            throw new ArrayIndexOutOfBoundsException();
        }
        deleteMethod(index);
        return true;
    }
    //删除方法
    private void deleteMethod(int index){
        //如果是数组尾元素,直接-1
        if (index == realLength-1){
            realLength--;
        }
        //如果不是数组尾元素,需要将该元素后面的元素往前移动一位
        else {
            for (int i = index ; i < realLength-1 ; i++){
                intArray[i] = intArray[i+1];
            }
            realLength--;
        }
    }

    //修改元素
    public boolean modify(int oldValue,int newValue){
        int index = find(oldValue);
        if (index == -1){
            System.out.println("数据不存在");
            return false;
        }
        else {
            intArray[index] = newValue;
            return true;
        }
    }

}package com.company.Array;

public class MyArray {
    //定义一个数组
    private int[] intArray;
    //数组实际长度
    private int realLength;
    //数组最大长度
    private int length;
    //构造一个数组
    public MyArray(int arrayLength){
        realLength = 0;
        length = arrayLength;
        intArray = new int[length];
    }
    //获得数组真实长度
    public int size(){
        return realLength;
    }
    //添加元素,返回成功与否
    public boolean add(int value){
        //数组满了
        if (realLength == length){
            System.out.println("数组满了,添加失败");
            return false;
        }
        else {
            //默认往数组尾添加数据
            intArray[realLength] = value;
            //真实长度+1
            realLength++;
        }
        return true;
    }
    //根据下标获取元素
    public int get(int index){
        //越界
        if (index < 0 && index > length - 1){
            throw new ArrayIndexOutOfBoundsException();
        }
        return intArray[index];
    }
    //遍历显示
    public void show(){
        for (int i : intArray){
            System.out.println(i);
        }
    }
    //根据元素查找元素下标
    public int find(int value){
        int index = -1;
        for (int i = 0 ; i < realLength ; i++){
            if (i == value){
                index = i;
                break;
            }
        }
        return index;
    }
    //根据下标删除元素
    public boolean delete(int value){
        //先查找该元素的下标
        int index = find(value);
        //如果没找到
        if (index == -1){
            return false;
        }
        else {
            //如果是数组尾元素,直接-1
            if (index == realLength-1){
                realLength--;
            }
            //如果不是数组尾元素,需要将该元素后面的元素往前移动一位
            else {
                for (int i = index ; i < realLength-1 ; i++){
                    intArray[i] = intArray[i+1];
                }
                realLength--;
            }
            return true;
        }
    }
    //修改元素
    public boolean modify(int oldValue,int newValue){
        int index = find(oldValue);
        if (index == -1){
            System.out.println("数据不存在");
            return false;
        }
        else {
            intArray[index] = newValue;
            return true;
        }
    }
 
}

テストする:

class test{
public static void main(String[] args) {
        MyArray myArray = new MyArray(5);
        myArray.add(1);
        myArray.add(2);
        myArray.add(3);
        myArray.add(4);
        System.out.print("所有元素:");
        myArray.show();
        System.out.println();
        System.out.println("第四个元素是:"+myArray.get(3));
        System.out.println("元素2的下标是:"+myArray.find(2));
        System.out.println("数组的实际大小:"+myArray.size());
        myArray.deleteByIndex(3);
        System.out.print("删除元素后:");
        myArray.show();
        System.out.println();
        myArray.modify(2,5);
        System.out.print("修改元素:");
        myArray.show();
    }
}

ここに画像の説明を挿入

この時点で、配列データ構造が実現され、配列を分析できます


分析

配列は最も基本的なデータ構造です。
配列はデータ構造のタスクを完了することができ、非常に単純です。実際のアプリケーションでデータを格納するために配列を選択しないのはなぜですか?

アレイの特性を分析できます

  1. 高速の
    順序付けされていない配列挿入を挿入し、データを配列の最後に挿入するだけで、配列がいっぱいかどうかを判断する必要があり、配列が配列である
    場合は、ソートも行われます(ソートについては後で実装されます)。それほど速くない
  2. 遅い検索
    順序付けされていない配列検索は、要素が見つかるまで配列を走査します。もちろん、順序付けされた配列検索は、アルゴリズムに従って検索速度を上げることができます
  3. ゆっくり削除
    する要素値の削除に従って、要素値に移動する必要があります。削除するときは、キューの最後に加えて、削除ごとに要素を後ろにシフトする必要があります
  4. 固定サイズ
    配列作成時にサイズの確認が必要ですサイズは固定です設定が大きいとスペースが無駄になる場合があります

一般に、アレイのパフォーマンスが低すぎるため、実際にアレイを使用することはほとんどありません

公開された121元の記事 ウォン称賛31 ビュー7869

おすすめ

転載: blog.csdn.net/key_768/article/details/105451862