데이터를 ListMap에 넣어 사용하면서 필요한 내용만 골라서 사용해야 하는 경우 Loop를 돌리는 방법도 있지만 stream을 이용하면 쉽게 필터링이 가능 합니다.

 

stream을 이용하기 때문에 리턴값이 stream으로 넘어오지만 collect를 사용하여 필요한 형태로 가공하여 받아올 수도 있습니다.

 

 

 

 

먼저 List에 있는 데이터를 필터링 하는 방법입니다.

 

        List<String> list = new ArrayList<>();
        list.add("test");
        list.add("atest");
        list.add("test1");
        list.add("btest");
        list.add("ctest");
        list.add("test2");
        list.add("dtest");
        list.add("etest");
       
        Stream<String> filter = list.stream().filter(l->l.startsWith("t"));
        filter.forEach(System.out::println);
 
        List<String> lst = list.stream().filter(l->l.startsWith("t"))
                       .collect(Collectors.toList());
        System.out.println("List : " + lst);

 

첫번째 system.outstream으로 받아온 예제이고

두번째는 collect를 이용하여 다시 List로 받아오는 내용입니다.

 

첫번째 결과는

test
test1
test2

 

두번째는

 

List : [test, test1, test2]

 

 

다음은 Map<String, String>을 필터링 하는 방법입니다.

 

Map<String, String> map = new HashMap<>();
              
map.put("aa", "ba");
map.put("baa", "abb");
map.put("abb", "bbb");
map.put("caa", "acc");
map.put("aac", "aac");
map.put("aad", "cad");
              
Map<String, String> filterMap = map.entrySet()
        .stream().filter(f->f.getKey().startsWith("a"))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println("key : " + filterMap);
              
Map<String, String> filterVal = map.entrySet()
        .stream().filter(f->f.getValue().startsWith("a"))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println("value : " + filterVal);
              
Map<String, String> conMap = map.entrySet()
        .stream().filter(f->f.getKey().contains("a"))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println("contain : " + conMap);

 

첫번째는 key 값이 “a”로 시작하는 내용만 필터링하고

두번째는 value 값이 “a”로 시작하는 내용만 필터링하고

세번째는 key 값에 “a”가 들어있는 내용만 필터링하는 예제 입니다.

 

각각의 결과는

 

key : {aa=ba, abb=bbb, aac=aac, aad=cad}
value : {caa=acc, aac=aac, baa=abb}
contain : {aa=ba, abb=bbb, caa=acc, aac=aac, baa=abb, aad=cad}

 

 

이번에는 Map<Integer, String>을 필터링 하는 방법입니다.

 

Map<Integer, String> intMap = new HashMap<>();
              
intMap.put(10, "ba");
intMap.put(20, "abb");
intMap.put(30, "bbb");
intMap.put(40, "acc");
intMap.put(50, "aac");
intMap.put(60, "cad");
              
Map<Integer, String> intFilter = intMap.entrySet()
        .stream().filter(x->x.getKey() > 30)
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println("intMap : " + intFilter);
              
              
Map<Integer, String> intMap2 = new HashMap<>();
for(Map.Entry<Integer, String> intmap : intMap.entrySet()) {
        if(intmap.getKey() > 30)
               intMap2.put(intmap.getKey(), intmap.getValue());
}
System.out.println("intMap : " + intMap2);

 

key 값이 숫자인 경우 조건식으로 필터링 하는 방법입니다.

결과는 동일한데 추출하는 방법을 하나는 for문을 사용해 봤습니다.

 

intMap : {50=aac, 40=acc, 60=cad}
intMap : {50=aac, 40=acc, 60=cad}

 - copy coding -

 

폴더에 있는 파일을 읽어와서 보여주는 간단한 프로그램 입니다.

웹에서 파일을 다운로드 해줘야 하는데 Batch로 파일이 계속 생성되고 있어서 목록을 수작업으로 하려니 귀찮아서 자동으로 파일 목록을 생성하도록 하기위한 기초적인 부분입니다.

 

Windows에서는 C:\\folderName으로 하면 되고 UNIX/LINUX/usr/copycoding 이런식으로 폴더명을 변경하면 됩니다.

 

현재 D:\\temp라는 folder에는 파일과 하부 폴더가 아래 그림과 같이 존재 합니다.

 

 

폴더와 파일을 불러오는 프로그램 소스는 매우 간단 합니다.

 

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
 
public class DirList {
 
        public static void main(String[] args) {
               // TODO Auto-generated method stub
                 String dirName = "D:\\temp";
              File dir = new File(dirName);
      
              File[] files2 = dir.listFiles();
              for(File f: files2){
                    String str = f.getName();
              
                    if(f.isDirectory()){
                        System.out.print(str+"\t");
                        System.out.print("DIR\n");
                    }else{
                        long ltime = f.lastModified();
                        String pattern = "yyyy-MM-dd hh:mm aa";
                               SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
                              
                               Date lastModifiedDate = new Date( ltime );
                               String frmDate = simpleDateFormat.format(lastModifiedDate);
                              
                        System.out.print(str+"/\t"+ frmDate + "/\t" +  f.length()+"bytes\n");
                      
                    }
                  
                }
 
        }
 
}

 

폴더이면 폴더명만 출력하고 파일이면 파일명과 작성일자 그리고 사이즈를 출력 합니다.

이걸 실행하면 아래와 같은 결과가 출력 됩니다.

 

backup_0808.txt/      2022-05-16 04:59 오후/ 242bytes
backup_0809.txt/      2022-05-16 04:59 오후/ 242bytes
backup_0810.txt/      2022-05-16 04:59 오후/ 242bytes
backup_0811.txt/      2022-05-16 04:59 오후/ 242bytes
backup_배치.bat/       2022-05-16 04:59 오후/ 242bytes
연습1   DIR
연습2   DIR

 

 

연습1, 연습2는 폴더인데 이것의 내부에 있는 파일명도 필요하다면 파일 목록 출력하는 부분을 method로 만들어서 호출하면 될것 같고.

Vo하나 만들어서 List<Vo>에 담아 화면에 던지면 끝이네요.

 

 

댓글에 너무 설명이 부족해서 몇자 추가합니다.

 

외부에서 호출할 URI와 Method를 생성 합니다.

@GetMapping("/fine_info")
public String fileInfo(Model model) {

}

Vo는 File과 관련된 어떤 내용을 보여줄지에 따라서 생성합니다.

class FileInfo {
      private String fileName;
      private String fileTime;

       getter/setter 추가...

}

그리고 method내에서

List<FileInfo>를 선언하고 FileInfo의 setter에 값을 하나씩 추가해 주고 화면으로 값을 넘겨 줍니다.

 


4. 자료구조(집합, 리스트, 튜플)

 

4.1 리스트


4.1.1 리스트 만들기


단순히 1개의 숫자, 1개의 문자, 1개의 문자열일 수도 있지만 그보다는 숫자들의 집합, 문자들의 집합을 하나로 묶어놓은 변수의 개념입니다.

>>> one = [1]

>>> a = [1, 2, 3, 4, 5]

>>> b = ['a', 'b', 'c', 'd']

>>> ab = [1, 2, 3, 4, 5, 'a', 'b', 'c', 'd']

>>> c = [1, 2, 'apple', 'banana']

>>> d = [1, 2, [3, 4], ['apple', 'banana'], True, False]

 

이런 방식으로 꼭 동일한 자료형 으로 리스트를 표현하지 않고 여러 자료형을 혼합되어 생성 하거나 리스트에 리스트를 포함하여 사용 가능 합니다.

리스트에 리스트를 요소로 추가해서 표현도 가능 합니다.

>>> a = [1, 2, 3, 4, 5]

>>> b = ['a', 'b', 'c', 'd']

>>> ab = [a, b]

>>> print(ab)

[[1, 2, 3, 4, 5], ['a', 'b', 'c', 'd']]

 

 

4.1.2 리스트 인텍싱


4.1.2.1 리스트 값 꺼내기


리스트에 들어있는 각각의 값들을 구별해 사용하기 위하여 첫 번째, 두 번째, 세 번째이런식으로 번호를 부여해야 하는데 이것을 인덱싱이라고 하며 0부터 시작을 합니다, 첫 번째가 0, 두 번째가 1… 이렇게 순서가 정해 집니다.

d = [1, 2, [3, 4], ['apple', 'banana']]

여기에서 d[0] 1, d[1] 2가 되며 리스트에 리스트가 포함되어도 하나의 요소로 처리 됩니다..

d[-1]은 맨 마지막 값인 [“apple”, “banana”]으로 d[3]과 동일 합니다.

그럼 apple을 가리키려면 어떻게 해야 할까요? d3번째 요소에서 또다시 첫 번째인 d[3][0] 또는 d의 맨 마지막 요소 내의 첫 번째인 d[-1][0] 하면 됩니다.

 

>>> d = [1, 2, [3, 4], ['apple', 'banana']]

>>> print(d[0], d[1], d[-1], d[3][0], d[-1][0])

1 2 ['apple', 'banana'] apple apple

 

 

4.1.2.2 리스트 값 추가


- append()


리스트에 값을 추가하려면 append()를 이용하여 값을 정해주면 됩니다.

d.append(6) 이렇게 하면 d의 맨 마지막에 6이 추가 되고 d.append(['a','b']) 하면 새로운 리스트 [‘a’, ‘b’]가 마지막에 추가 됩니다.

 

>>> d = [1, 2, [3, 4], ['apple', 'banana']]

>>> print(d[0], d[1], d[-1], d[3][0], d[-1][0])

1 2 ['apple', 'banana'] apple apple

>>> d = [1, 2, [3, 4], ['apple', 'banana']]

>>> d.append(6)

>>> print(d)

[1, 2, [3, 4], ['apple', 'banana'], 6]

>>> d.append(['a','b'])

>>> print(d)

[1, 2, [3, 4], ['apple', 'banana'], 6, ['a', 'b']]

 

 - 덧셈


덧셈 기호를 이용하여 리스트에 리스트를 더하여 정의 할 수 있습니다.

 

>>> a = ['apple', 'banana']

>>> a = a + a

>>> 

>>> print(a)

['apple', 'banana', 'apple', 'banana']

>>> b = [1, 2, 3, 4]

>>> a = a + b

>>> print(a)

['apple', 'banana', 'apple', 'banana', 1, 2, 3, 4]

 


- 곱셈


곱셈 기호를 이용하여 리스트에 상수를 곱하여 정의 할 수 있습니다곱하는 정수 만큼 리스트가 복제 되어 추가 됩니다.

 

>>> a = ['apple', 'banana']

>>> a = a * 3

>>> print(a)

['apple', 'banana', 'apple', 'banana', 'apple', 'banana']

 

 

- insert()를 이용 중간에 추가


insert(index, value)를 이용하여 리스트의 원하는 위치에 값을 추가 할 수 있습니다. 파라미터로 index는 추가할 리스트 요소의 순서를 말하고 value는 그 위치에 삽입할 값입니다.

리스트의 두 번째 요소(index 1) 위치에 값을 삽입해 보겠습니다.

 

>>> d = [1, 2, [3, 4], ['apple', 'banana']]

>>> d.insert(1, ["b", "c"])

>>> print(d)

[1, ['b', 'c'], 2, [3, 4], ['apple', 'banana']]


python study

 

 

4.1.2.3 리스트 값 변경

                

리스트 내의 값을 변경 하려면 인덱스를 사용 하면 됩니다.

리스트 dd = [1, 2, [3, 4], ['apple', 'banana'], 6, ['a', 'b']] 와 같이 선언 하였을 때 d[1] = 7은 인덱스 값이 1인 요소의 값을 7로 변경 하고 d[-1] = 9하면 리스트의 마지막에 있는 리스트 [‘a’, ‘b’] 9로 변경 됩니다.

리스트 내부에 있는 리스트의 값을 변경 하는 경우 d[3][0] = "orange"하면 ‘app’e’‘orange’로 변경 됩니다.

 

>>> d = [1, 2, [3, 4], ['apple', 'banana'], 6, ['a', 'b']]

>>> d[1] = 7

>>> print(d)

[1, 7, [3, 4], ['apple', 'banana'], 6, ['a', 'b']]

>>> d[-1] = 9

>>> print(d)

[1, 7, [3, 4], ['apple', 'banana'], 6, 9]

>>> d[3][0] = "orange"

>>> print(d)

[1, 7, [3, 4], ['orange', 'banana'], 6, 9]

 

 

4.1.2.4 리스트 값 삭제


- del


리스트 항목의 삭제는 del 명령을 이용 합니다. del d[1] 하면 리스트의 index값이 1인 두 번째에 있는 요소가 삭제 됩니다.

 

>>> d = [1, 7, [3, 4], ['orange', 'banana'], 6, 9]

>>> del d[1]

>>> print(d)

[1, [3, 4], ['orange', 'banana'], 6, 9]

 

 

- remove()


리스트에서 index의 위치가 아닌 값을 찾아서 삭제하는 방법은 remove()를 사용 합니다.  remove(value)에서 value는 삭제하려는 값을 입력하면 리스트 index 순으로 제일 처음에 나오는 값을 찾아서 삭제 합니다.

 

>>> c = [1, 2, 3, [1, 2, 3], 1, 2, 3]

>>> c.remove(3)

>>> print(c)

[1, 2, [1, 2, 3], 1, 2, 3]

>>> c.remove(3)

>>> print(c)

[1, 2, [1, 2, 3], 1, 2]

 

리스트 내부에 있는 3의 값은 삭제가 되지 않고 마지막 3이 삭제 되었습니다리스트 내부의 리스트에 있는 값을 삭제하려면 리스트위치의 인덱스에서 다시 한번 인덱스를 사용합니다.

 

>>> print(c)

[1, 2, [1, 2, 3], 1, 2]

>>> c[2].remove(3)

>>> print(c)

[1, 2, [1, 2], 1, 2]

 

 

4.1.2.5 기타 기능


- len()


len()을 이용하여 리스트의 길이를 구합니다. len(list )으로 사용하며 전체 index 값을 반환 하며리스트내의 리스트도 1개로 계산합니다.

 

>>> c = [1, 2, 3, [1, 2, 3], 1, 2, 3]

>>> cnt = len(c)

>>> print(cnt)

7

>>> len(c)

7

  

 

- index()


index()를 이용하면 리스트 내부의 값에 해당하는 인덱스를 구할 수 있습니다. index(value)value에 찾으려는 값을 넣어주면 index를 반환합니다리스트 내부의 리스트를 찾는 경우에도 valuelist를 넣어주면 인덱스가 반환 됩니다.

 

>>> c = [1, 2, 3, [1, 2, 3], 1, 2, 3]

>>> c.index(3)

2

>>> c.index([1,2,3])

3

 

 

- pop()


리스트의 마지막 값을 꺼내고 그 마지막 값을 삭제하는 경우 pop()을 사용합니다.

 

>>> c = [1, 2, 3, [1, 2, 3], 1, 2, 3]

>>> c.pop()

3

>>> print(c)

[1, 2, 3, [1, 2, 3], 1, 2]

 

 

pop(index)를 사용하면 index 값을 이용하여 꺼내올 요소의 위치를 정하고 그 요소 삭제 할 수 있습니다. 중간에 있는 리스트[1, 2, 3]을 꺼내고 삭제해 보겠습니다.

 

>>> c = [1, 2, 3, [1, 2, 3], 1, 2, 3]

>>> c.pop(3)

[1, 2, 3]

>>> print(c)

[1, 2, 3, 1, 2, 3]

 

 

- reverse()


리스트 내부의 index 순서를 반대로 뒤집어 값이 역순으로 재배열 됩니다.

 

>>> c = [1, 2, 3, [1, 2, 3], 1, 2, 3]

>>> print(c[0])

1

>>> c.reverse()

>>> print(c)

[3, 2, 1, [1, 2, 3], 3, 2, 1]

>>> print(c[0])

3

 

리스트 내부의 리스트 요소 값들은 변경되지 않습니다. 이걸 뒤집으려면 인덱스를 사용해야 합니다.

 

>>> print(c)

[3, 2, 1, [1, 2, 3], 3, 2, 1]

>>> c[3].reverse()

>>> print(c)

[3, 2, 1, [3, 2, 1], 3, 2, 1]

 

- sort()


리스트의 값들을 오름차 순으로 정렬해 줍니다. 동일한 자료형만 처리가 가능 합니다.

 

>>> c = [5, 2, 7, 1, 9, 3, 4]

>>> c.sort()

>>> print(c)

[1, 2, 3, 4, 5, 7, 9]

>>> a = ['a','z','c']

>>> a.sort()

>>> print(a)

['a', 'c', 'z']

 

 

- 슬라이싱


리스트의 index를 이용하여 필요한 부분 만큼 값을 뽑아오는 방법입니다.

a[1:3] : index 값이 1보다 크거나 같고 3 미만(1<= a[index] < 3)

a[:3] : index 값이 처음부터 3 미만( a[index] < 3)

a[3:] : index 값이 3보다 크거나 같은 값(3 <= a[index])

 

>>> a = [1, 2, 3, 4, 5, 6, 7]

>>> print(a[1:3])

[2, 3]

>>> print(a[:3])

[1, 2, 3]

>>> print(a[3:])

[4, 5, 6, 7]


- copy coding -


1

+ Recent posts