ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 6. MyArrayList
    BackEnd/JAVA 2022. 2. 23. 16:19
    728x90
    MyArrayList.java
    import java.util.ArrayList;
     
     
    public class MyArrayList {
        //
        // -- Fields Area --
        //
        // 기능을 참고하기 위한 샘플
        private ArrayList<Integer> sample =
                new ArrayList<Integer>();
        
        // final: 최종
        private final int DEFAULT_LEN = 3;
        private int arr[] = null;
        private int curIdx = 0;        // 현재 데이터가 들어갈 인덱스
        private int length = 0;
        
        
        //
        // -- Constructor Area --
        //
        public MyArrayList() {
            // 생성시 크기가 지정되지 않으면 기본 크기로 생성
            length = DEFAULT_LEN;
            arr = new int[length];
        }
        
        public MyArrayList(int _len) {
            // 만약에 길이가 1 보다 작은 수가 들어왔다면 기본 크기로 생성
            if (_len < 1) _len = DEFAULT_LEN;
            // 생성시 크기가 지정되면 지정된 크기만큼 생성
            length = _len;
            arr = new int[length];
        }
        
        
        //
        // -- Public Area --
        //
        public void add(int _val) {
            //sample.add();
            // 1. 데이터를 추가하러 왔을 때 공간이 모자르니 추가
            // 현재 배열이 가득 찼는지 검사
            if (checkFull()) arrayExtend();
            
            //arr[curIdx] = _val;
            //++curIdx;
            setValueWithIndex(curIdx, _val);
            // 2. 인덱스를 증가시키고 보니 공간이 모자르니 추가
        }
        
        public void add(int _idx, int _val) {
            // _idx 예외처리
            // 1. 인덱스는 0 보다 작으면 안됨
            if (_idx < 0) return;
            // 2. 인덱스가 배열의 길이를 벗어나면 안됨
            if (_idx >= length) return;
            // 3. 인덱스가 curIdx를 벗어나면 안됨
            if (_idx > curIdx) return;
            
            // [10, 20, 30, 40, 50] 5/5
            // add(1, 100);
            // [10, ' ', 20, 30, 40, 50]
            // [10, 100, 20, 30, 40, 50] 6/10
            if (checkFull()) arrayExtend();
            
            int tmpIdx = curIdx;
            while(tmpIdx > _idx) {
                arr[tmpIdx] = arr[tmpIdx - 1];
                --tmpIdx;
            }
            //arr[_idx] = _val;
            //++curIdx;
            setValueWithIndex(_idx, _val);
        }
        
        public int removeWithIndex(int _idx) {
            //sample.remove
            // 1. 인덱스가 0 보다 작으면 안됨
            // -1: Error code
            if (_idx < 0) return -1;
            // 2. 인덱스가 curIdx 보다 작아야 됨
            if (_idx >= curIdx) return -1;
            // 3. curIdx가 0이면 데이터가 없음
            if (checkEmpty()) return -1;
            
            // 데이터가 지워지기 전에 따로 저장
            // -> 반환해줘야 하기 때문
            int delData = arr[_idx];
            
            int tmpIdx = _idx + 1;
            while (tmpIdx <= curIdx) {
                arr[tmpIdx - 1] = arr[tmpIdx];
                ++tmpIdx;
            }
            // 하나가 지워졌으니 현재 인덱스 줄이기
            --curIdx;
            
            return delData;
        }
        
        // 1. 전달된 값이 존재하면 제거 -> true 반환
        // 2. 전달된 값이 없으면 종료 -> false 반환
        public boolean removeWithValue(int _val) {
            for (int i = 0; i < curIdx; ++i) {
                if (arr[i] == _val) {
                    removeWithIndex(i);
                    return true;
                }
            }        
            return false;
        }
        
        public void clear() {
            curIdx = 0;
        }
        
        public boolean contains(int _val) {
            for (int i = 0; i < curIdx; ++i) {
                if (arr[i] == _val) return true;
            }
            return false;
        }
        
        public void printAll() {
            System.out.println(
                    "-- " + curIdx + " / " + length + " --");
            for (int i = 0; i < curIdx; ++i) {
                System.out.println(i + ": " + arr[i]);
            }
        }
        
        public boolean checkEmpty() {
            return curIdx == 0;
        }
        
        
        //
        // -- Private Area --
        //
        private boolean checkFull() {
            return curIdx >= length;
        }
        
        // 배열의 길이를 두 배로 확장
        private void arrayExtend() {
            // 배열 늘리기
            // 길이를 2배로 늘림
            length *= 2;
            // 길이가 2배로 늘어난 새로운 배열 생성
            int newArr[] = new int[length];
            // 원래 배열에서 데이터 복사
            int i = 0;
            for (int val : arr) {
                newArr[i] = val;
                ++i;
            }
            // 새로운 배열을 클래스가 관리할 배열로 지정
            arr = newArr;
        }
        
        private void setValueWithIndex(int _idx, int _val) {
            arr[_idx] = _val;
            ++curIdx;
        }
    } // MyArrayList

     

    Main.java
    public class Main {
        public static void main(String[] _args) {
            MyArrayList arrList = new MyArrayList(2);
            arrList.add(10);
            arrList.add(20);        
            arrList.printAll();
            
            arrList.add(30);
            arrList.add(40);
            arrList.add(1, 50);
            arrList.printAll();
            
            arrList.removeWithValue(50);
            arrList.printAll();
        }
    }

    'BackEnd > JAVA' 카테고리의 다른 글

    Break 문의 연습  (0) 2022.03.29
    For 문의 연습  (0) 2022.03.28
    5-1. 상속 연습 예제 - 네비게이션  (0) 2022.02.22
    5. 상속(Inheritance)  (0) 2022.02.21
    4. 배열(Array)  (0) 2022.02.18

    댓글

Designed by Tistory.