본문 바로가기
공부/Java

출력

by 무심한고라니 2021. 8. 13.

알고리즘 문제를 풀다 보면 배열 혹은 컬렉션에 대한 출력[1]이 필요한 경우가 있다. 간략하게 한 번 정리해보고자 한다.

 

1. 출력

2. 다차원

3. 자바스크립트

 

_____

출력

다음 데이터를 각각 출력해보는 경우를 생각해보고자 한다.

 

// [10,30,17,20,15,18,45,12]

int[] nArray = {10, 30, 17, 20, 15, 18, 45, 12};

List<Integer> nList = Arrays.asList(
			new Integer("10"), new Integer("30"), new Integer("17"),
			new Integer("20"), new Integer("15"), new Integer("18"),
			new Integer("45"), new Integer("12"));

// Map, Set

 

원하는 출력 형식은 위 주석과 같다고 할 때 자바 8 이전의 경우에는 반복문을 이용[2]해 출력할 수 있을 것이다.

 

for (int i = 0, nArrLen = nArray.length; i < nArrLen; i++) { // [3][4]
    if (i == 0) {
        System.out.print("[" + nArray[i] + ",");
    } else if (i == nArrLen - 1) {
        System.out.print(nArray[i] + "]");
    } else {
        System.out.print(nArray[i] + ",");
    }
}

for (int i = 0, nListLen = nList.size(); i < nListLen; i++) {
    if (i == 0) {
        System.out.print("[" + nList.get(i) + ",");
    } else if (i == nListLen - 1) {
        System.out.print(nList.get(i) + "]");
    } else {
        System.out.print(nList.get(i) + ",");
    }
}

 

헌데 단순 출력을 위해서라기엔 코드가 꽤 길고 출력 결과를 예측하기도 조금 불편해보인다. 따라서 자바 8 이후에는 아래와 같이 코드를 다듬을 수 있다.

 

// [5][6]
System.out.println("[" + Arrays.stream(nArray)
                               .mapToObj(String::valueOf)
                               .collect(Collectors.joining(",")) + "]");

System.out.println("[" + nList.stream()
                              .map(String::valueOf)
                              .collect(Collectors.joining(",")) + "]");

 

선언적인, 즉 조금 더 직관적인 코드 이해가 가능해졌다. 한편 이 경우 마지막 출력의 경우 ,를 찍지 않기 위해 위처럼 출력하였지만 보통 forEach로 출력[7]하는 경우가 많은데 이에 대해 다음 글에서 잘 정리되어 있다. 

 

 

다차원

/*
 * [10,30,17]
 * [20,15,54]
 * [18,45,12]
 */
int[][] nDeepArray = new int[][] {{10, 30, 17}, {20, 15, 54}, {18, 45, 12}};

 

1차원 배열과 마찬가지로 내장 출력 형식이라면 toString 메소드를 사용하는 것이 가장 간단하다. Arrays.toString과 마찬가지로 Arrays.deepToString을 사용[8]하면 된다. 그렇다면 단순 반복을 사용하지 않고 위처럼 커스텀한 출력을 어떻게 할 수 있을까?

 

작성중

 

 

자바스크립트

 

 

 

_____

1. 출력이 아닌 배열 혹은 컬렉션을 반환하는 경우도 더 많이 있지만

2. 반복문을 사용하지 않더라도 Arrays 클래스에 재정의(오버라이딩)되어 있는 toString 메소드를 사용할 수도 있다. 위 예의 경우 아래와 같다.

// [10, 30, 17, 20, 15, 18, 45, 12]
System.out.println(Arrays.toString(nArray));

하지만 위의 경우 원하는 출력 형식과는 조금 다르게 숫자 사이에 ,뿐 아니라 공백도 포함되게 된다. 추가로 Arrays 클래스에 오버로딩된 toString 메소드 중 하나다.

/** Returns a string representation of the contents of the specified array. */
public static String toString(int[] a) {
    if (a == null)
        return "null";
    int iMax = a.length - 1;
    if (iMax == -1)
        return "[]";

    StringBuilder b = new StringBuilder();
    b.append('[');
    for (int i = 0; ; i++) {
        b.append(a[i]);
        if (i == iMax)
            return b.append(']').toString();
        b.append(", ");
    }
}

3. 인덱스별로 처리해주기 위해 향상된 for문을 사용하지 못했다.

4.

5. int 배열의 경우 문자열 배열과 같이 아래처럼 출력하면 안 된다(고민 필요).

final String[] sArray = {"b", "c", "a", "C", "B", "A", "3", "2", "가", "나"};

// [b,c,a,C,B,A,3,2,가,나]
System.out.println("[" + Arrays.asList(sArray)
                               .stream()
                               .collect(Collectors.joining(",")) + "]");

6. 아래 코드의 경우 마지막에 ,가 찍힌다는 문제가 있는데 어떻게 해결할 수 있을까?

Arrays.stream(Data.nArray)
      .forEach(e -> System.out.print(e + ","));

7.

8. 아래와 같다.

int[][] nDeepArray = new int[][] {{10, 30, 17}, {20, 15, 54}, {18, 45, 12}};
// [[I@15db9742, [I@6d06d69c, [I@7852e922]
System.out.println(Arrays.toString(nDeepArray));
// [[10, 30, 17], [20, 15, 54], [18, 45, 12]]
System.out.println(Arrays.deepToString(nDeepArray));

9.

 

_____

참고

 

 

 

'공부 > Java' 카테고리의 다른 글

예외 처리 시 RETURN문 위치  (0) 2022.01.17
날짜 유효성 검사  (0) 2022.01.17
자바 다형성  (0) 2020.12.14
자바 추상화  (0) 2020.12.14
오류 코드보다 예외를 사용하라!  (0) 2020.12.12

댓글