본문 바로가기
JAVA

배열 다루기(2) [코딩백과 with JAVA]

by GangDev 2024. 12. 21.
  1. 스트림 생성

stream() 메서드를 사용하여 배열로부터 스트림을 생성할 수 있습니다:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class StreamCreationExample {
    public static void main(String[] args) {
        // 1. 문자열 배열로부터 스트림 생성
        String[] fruits = {"Apple", "Banana", "Cherry", "Date", "Elderberry"};
        Stream<String> fruitStream = Arrays.stream(fruits);
        fruitStream.forEach(System.out::println);

        // 2. 정수 배열로부터 스트림 생성
        int[] numbers = {1, 2, 3, 4, 5};
        IntStream numberStream = Arrays.stream(numbers);
        System.out.println("합계: " + numberStream.sum());

        // 3. 2차원 배열로부터 스트림 생성
        int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        Stream<int[]> rowStream = Arrays.stream(matrix);
        rowStream.forEach(row -> System.out.println(Arrays.toString(row)));

        // 4. 부분 배열로부터 스트림 생성
        String[] partialFruits = Arrays.copyOfRange(fruits, 1, 4);
        Stream<String> partialStream = Arrays.stream(partialFruits);
        System.out.println("부분 배열의 길이: " + partialStream.count());

        // 5. 스트림을 사용한 데이터 처리
        int[] scores = {85, 92, 78, 95, 88};
        double average = Arrays.stream(scores)
                .average()
                .orElse(Double.NaN);
        System.out.println("평균 점수: " + average);

        // 6. 스트림을 사용한 필터링과 정렬
        String[] words = {"hello", "world", "java", "programming", "example"};
        List<String> sortedWords = Arrays.stream(words)
                .filter(word -> word.length() > 5)
                .sorted()
                .collect(Collectors.toList());
        System.out.println("길이가 5 이상인 단어들: " + sortedWords);

        // 7. 스트림을 사용한 중복 제거
        int[] numbersWithDuplicates = {1, 2, 2, 3, 4, 4, 5, 6, 6};
        List<Integer> uniqueNumbers = Arrays.stream(numbersWithDuplicates)
                .distinct()
                .boxed()
                .collect(Collectors.toList());
        System.out.println("중복 제거된 숫자들: " + uniqueNumbers);

        // 8. 스트림을 사용한 변환
        String[] names = {"Alice", "Bob", "Charlie", "David"};
        List<String> upperCaseNames = Arrays.stream(names)
                .map(String::toUpperCase)
                .collect(Collectors.toList());
        System.out.println("대문자로 변환된 이름들: " + upperCaseNames);

        // 9. 스트림을 사용한 그룹화
        String[] colors = {"Red", "Blue", "Green", "Red", "Blue", "Yellow", "Green"};
        Arrays.stream(colors)
                .collect(Collectors.groupingBy(String::toLowerCase))
                .forEach((key, value) -> System.out.println(key + ": " + value));

        // 10. 스트림을 사용한 병렬 처리
        int[] largeArray = new int[1000000];
        for (int i = 0; i < largeArray.length; i++) {
            largeArray[i] = (int) (Math.random() * 100);
        }
        long startTime = System.nanoTime();
        int sum = Arrays.stream(largeArray).sum();
        long endTime = System.nanoTime();
        System.out.println("순차 스트림 합계: " + sum + ", 시간: " + (endTime - startTime) + " 나노초");

        startTime = System.nanoTime();
        sum = Arrays.stream(largeArray).parallel().sum();
        endTime = System.nanoTime();
        System.out.println("병렬 스트림 합계: " + sum + ", 시간: " + (endTime - startTime) + " 나노초");
    }
}
  1. 배열을 문자열로 변환

toString() 메서드를 사용하여 배열을 문자열로 변환할 수 있습니다:

import java.util.Arrays;

public class ArrayToStringExample {
    public static void main(String[] args) {
        // 1. 기본적인 문자열 배열 변환
        String[] fruits = {"Apple", "Banana", "Cherry", "Date", "Elderberry"};
        System.out.println("기본 변환: " + Arrays.toString(fruits));

        // 2. 정수 배열 변환
        int[] numbers = {1, 2, 3, 4, 5};
        System.out.println("정수 배열 변환: " + Arrays.toString(numbers));

        // 3. 불리언 배열 변환
        boolean[] bools = {true, false, true, false, true};
        System.out.println("불리언 배열 변환: " + Arrays.toString(bools));

        // 4. 객체 배열 변환
        Person[] people = {
            new Person("Alice", 25),
            new Person("Bob", 30),
            new Person("Charlie", 28)
        };
        System.out.println("객체 배열 변환: " + Arrays.toString(people));

        // 5. 2차원 배열 변환
        int[][] matrix = {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}
        };
        System.out.println("2차원 배열 변환: " + Arrays.deepToString(matrix));

        // 6. 부분 배열 변환
        String[] partialFruits = Arrays.copyOfRange(fruits, 1, 4);
        System.out.println("부분 배열 변환: " + Arrays.toString(partialFruits));

        // 7. 사용자 정의 문자열 변환
        String[] words = {"hello", "world", "java", "programming", "example"};
        String customString = Arrays.stream(words)
                .collect(Collectors.joining(", ", "[", "]"));
        System.out.println("사용자 정의 문자열: " + customString);

        // 8. 대용량 배열 변환 (성능 고려)
        int[] largeArray = new int[1000000];
        for (int i = 0; i < largeArray.length; i++) {
            largeArray[i] = i;
        }
        long startTime = System.nanoTime();
        String largeArrayString = Arrays.toString(largeArray);
        long endTime = System.nanoTime();
        System.out.println("대용량 배열 변환 시간: " + (endTime - startTime) + " 나노초");

        // 9. 대용량 배열의 일부만 문자열로 변환
        int[] partialLargeArray = Arrays.copyOfRange(largeArray, 0, 100);
        System.out.println("대용량 배열의 일부 문자열: " + Arrays.toString(partialLargeArray));

        // 10. 사용자 정의 객체의 toString() 메서드 오버라이딩
        Person person = new Person("John", 35);
        System.out.println("사용자 정의 객체 문자열: " + person);
    }
}

class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return name + " (age: " + age + ")";
    }
}

배열 조작 시 주의사항

  1. null 처리: null인 배열에 조작을 시도하면 NullPointerException이 발생할 수 있습니다.
  2. 인덱스 범위: 배열의 인덱스 범위를 벗어나지 않도록 주의해야 합니다.
  3. 타입 일치: 배열의 타입과 조작하는 값의 타입이 일치해야 합니다.

실제 활용 예시

배열 조작은 다양한 알고리즘과 데이터 처리 작업에서 자주 사용됩니다:

import java.util.Arrays;

public class ArrayManipulationExample {
    public static void main(String[] args) {
        // 1. 학생 점수 통계 계산
        int[] scores = {85, 92, 78, 95, 88, 76, 90, 89, 91, 84};
        calculateStatistics(scores);

        // 2. 문자열 배열에서 중복 제거
        String[] words = {"apple", "banana", "apple", "cherry", "banana", "date"};
        String[] uniqueWords = removeDuplicates(words);
        System.out.println("중복 제거된 단어들: " + Arrays.toString(uniqueWords));

        // 3. 정수 배열에서 특정 범위의 요소 찾기
        int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int[] result = findInRange(numbers, 3, 7);
        System.out.println("3부터 7 사이의 숫자: " + Arrays.toString(result));

        // 4. 문자열 배열에서 특정 문자열 포함 여부 확인
        String[] fruits = {"apple", "banana", "cherry", "date", "elderberry"};
        boolean contains = containsString(fruits, "cherry");
        System.out.println("배열에 'cherry'가 포함되어 있나요? " + contains);

        // 5. 정수 배열에서 최대값과 최소값 찾기
        int[] values = {10, 5, 8, 12, 3, 15, 7};
        int[] minMax = findMinMax(values);
        System.out.println("최소값: " + minMax[0] + ", 최대값: " + minMax[1]);

        // 6. 문자열 배열에서 빈도수 계산
        String[] colors = {"red", "blue", "green", "red", "blue", "yellow", "green", "red"};
        calculateFrequency(colors);

        // 7. 정수 배열에서 특정 값의 위치 찾기
        int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int index = findIndex(array, 5);
        System.out.println("5의 위치: " + index);

        // 8. 문자열 배열에서 문자열 길이 기준 정렬
        String[] names = {"John", "Alice", "Bob", "Charlie", "David"};
        Arrays.sort(names, (a, b) -> Integer.compare(a.length(), b.length()));
        System.out.println("이름 길이 기준 정렬: " + Arrays.toString(names));

        // 9. 정수 배열에서 특정 범위의 합계 계산
        int[] numbers2 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int sum = sumInRange(numbers2, 3, 7);
        System.out.println("3부터 7까지의 합계: " + sum);

        // 10. 문자열 배열에서 특정 문자로 시작하는 단어 찾기
        String[] words2 = {"hello", "world", "java", "programming", "example"};
        String[] result2 = findWordsStartingWith(words2, 'p');
        System.out.println("'p'로 시작하는 단어들: " + Arrays.toString(result2));
    }

    private static void calculateStatistics(int[] scores) {
        int sum = Arrays.stream(scores).sum();
        double average = (double) sum / scores.length;
        int max = Arrays.stream(scores).max().getAsInt();
        int min = Arrays.stream(scores).min().getAsInt();
        System.out.println("합계: " + sum);
        System.out.println("평균: " + average);
        System.out.println("최대값: " + max);
        System.out.println("최소값: " + min);
    }

    private static String[] removeDuplicates(String[] words) {
        return Arrays.stream(words).distinct().toArray(String[]::new);
    }

    private static int[] findInRange(int[] numbers, int start, int end) {
        return Arrays.stream(numbers)
                .filter(num -> num >= start && num <= end)
                .toArray();
    }

    private static boolean containsString(String[] fruits, String target) {
        return Arrays.stream(fruits).anyMatch(fruit -> fruit.equals(target));
    }

    private static int[] findMinMax(int[] values) {
        int min = Arrays.stream(values).min().getAsInt();
        int max = Arrays.stream(values).max().getAsInt();
        return new int[] {min, max};
    }

    private static void calculateFrequency(String[] colors) {
        Arrays.stream(colors)
                .collect(Collectors.groupingBy(color -> color, Collectors.counting()))
                .forEach((color, count) -> System.out.println(color + ": " + count));
    }

    private static int findIndex(int[] array, int target) {
        return Arrays.asList(array).indexOf(target);
    }

    private static int sumInRange(int[] numbers, int start, int end) {
        return Arrays.stream(numbers)
                .filter(num -> num >= start && num <= end)
                .sum();
    }

    private static String[] findWordsStartingWith(String[] words, char prefix) {
        return Arrays.stream(words)
                .filter(word -> word.startsWith(String.valueOf(prefix)))
                .toArray(String[]::new);
    }
}

이 예시 코드는 배열 조작의 다양한 실제 활용 사례를 보여주며, 특히 데이터 처리, 통계 계산, 검색, 정렬, 그리고 필터링 등의 작업을 배열을 사용하여 수행하는 방법을 시연합니다. 또한 스트림 API를 사용하여 이러한 작업을 더 효율적으로 수행하는 방법도 보여줍니다.

  1. 학생 점수 통계 계산: 배열을 사용하여 학생들의 점수 통계를 계산합니다.
  2. 문자열 배열에서 중복 제거: 스트림을 사용하여 문자열 배열에서 중복을 제거합니다.
  3. 정수 배열에서 특정 범위의 요소 찾기: 특정 범위 내의 요소를 찾는 방법을 보여줍니다.
  4. 문자열 배열에서 특정 문자열 포함 여부 확인: 배열에 특정 문자열이 포함되어 있는지 확인하는 방법을 시연합니다.
  5. 정수 배열에서 최대값과 최소값 찾기: 배열에서 최대값과 최소값을 찾는 방법을 보여줍니다.
  6. 문자열 배열에서 빈도수 계산: 각 문자열의 발생 빈도를 계산하는 방법을 시연합니다.
  7. 정수 배열에서 특정 값의 위치 찾기: 배열에서 특정 값의 위치를 찾는 방법을 보여줍니다.
  8. 문자열 배열에서 문자열 길이 기준 정렬: 문자열의 길이를 기준으로 배열을 정렬하는 방법을 시연합니다.
  9. 정수 배열에서 특정 범위의 합계 계산: 특정 범위 내의 요소들의 합계를 계산하는 방법을 보여줍니다.
  10. 문자열 배열에서 특정 문자로 시작하는 단어 찾기: 특정 문자로 시작하는 단어들을 찾는 방법을 시연합니다.

편히 모아진 글 보시려면 아래 위키독스 링크 >>
https://wikidocs.net/book/17111