수업

+9 문자열 배열

hs_developer 2022. 5. 13. 17:51

p206

 

중요 라이브러리

 

1. 문자 개수

 

length(): init

String s = "Hello";
s.length() → 5

String s = "홍길동";
s.length() → 3

 

 

2. 문자 자르기

 

substring(int s): String
substring(int s, int e): String

"0123456789" → 문자열 0번부터 char[]

substring(5) → 56789
substring(2, 7) → 23456 (7 제외)

indexOf(String s): int (리턴형)
lastIndexOf(String s): int

String s = "Hello Java";
            0123456789

s.indexOf("e") → 1
s.indexOf("a") → 7

 

 

3. 공백 제거

 

trim(): String
String s = " Hello Java "
s.trim() = "Hello Java" → 좌우 공백 제거
s.replace(" ", "") → 가운데 공백 제거
String s = "1234Hello한글Java123";
s.replaceAll("[^가-힣]", "") → 한글 제외하고 지운다

숫자: [0-9]
알파벳: [A-Za-z]

//예시
public static void main(String[] args) {
		
    String s = "1234Hello한글Java123";
    String res = s.replaceAll("[^가-힣]", "");
    // res: 처리한 결과 값

    System.out.println(res);

}
    
한글

 

 

 

4. 단어 별 구분해서 저장

 

split(String s): String[]

String s = "red, blue, green, black, pink"
String[] color = s.split(",")
color[0]="red" color[1]="blue"


// 예시
public static void main(String[] args) {
		
    String s2="김가가,김나나,김다다,김라라,김바바";
    String[] ss=s2.split(",");

    for(String sss:ss)
    {
        System.out.println(sss);
    }

}

김가가
김나나
김다다
김라라
김바바

 

 

 

5. 문자 변경

 

1.
replace(String s1, String s2): String

String s = "Hello Java";
s.replace("a", "b");
Hello Jbvb


2.
replaceAll(String s1, String s2): String

toUpperCase(): String → 대문자
	String s = "hello"
    s.toUpperCase() → HELLO
    
toLowerCase(): String → 소문자
	String s = "HELLO"
    s.toLowerCase() → hello

 

 

6. 모든 데이터형 → 문자열 변경

 

valueOf(기본형): String
valueOf(1) → "1"
valueOf(true) → "true"

 

7. 비교

 

if에서 주로 사용

equals(): boolean → 문자열 비교
contains(): boolean → 포함한 문자
startsWith(): boolean → 시작 문자열
endsWith(): boolean → 끝 문자열

 

 


 

예제

 

 

1. 문자열 검색

 

 

public static void main(String[] args) {

// contains : 포함 문자열 
Scanner scan=new Scanner(System.in);
System.out.print("검색어 입력:");
String fd=scan.next();
try
{
    for(int i=1;i<=40;i++)
    {
        // 저장 => 정적 (Jsoup) , 동적 ()
        Document doc=Jsoup.connect("https://movie.naver.com/movie/sdb/rank/rmovie.naver?sel=pnt&date=20220512&page="+i).get();
        Elements title=doc.select("div.tit5 a");
        for(int j=0;j<title.size();j++)
        {
            //if(title.get(j).text().contains(fd))
            // => 검색 
            //if(title.get(j).text().startsWith(fd))
            // => 자동완성기 
            //if(title.get(j).text().endsWith(fd))
            if(title.get(j).text().equals(fd))
                // 상세보기 , 수정 , 삭제 
            {
             System.out.println((j+1)+"."+title.get(j).text());

            }
        }
    }
}catch(Exception ex){}

 

 

 

 

2. 문자열 변경 + 개수 세기

 

 

public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		
		// toUpperCase: 대문자 변환
		System.out.println("알파벳 문자열 입력: ");
		String data = sc.next();
		
		String data_change = data.toUpperCase(); // data_change → 값을 꼭 받아야 함
		System.out.println(data_change);
		
		
		// 'A'가 몇 개를 포함 하는지
		int count = 0; 
		
		for(int i=0; i<data_change.length(); i++)
		{
			// 문자열을 1개씩 가지고 온다 → charAt(index)
			char c = data_change.charAt(i);
			
			if(c=='A')
				count++;
		}
		System.out.println("A의 개수는 " + count);

 

알파벳 문자열 입력: 
adfadfdfafadf
ADFADFDFAFADF
A의 개수는 4

 

 

문자열 변경(2)

 

문자열 → char[]

 

public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		
		System.out.print("알파벳 입력: ");
		String data = sc.next();
		
		System.out.println("원본: " + data);
		
		String data_change = data.toLowerCase();	
		System.out.println("변경: " + data_change);
		
		
		// char[]로 변환
		char[] arr = data_change.toCharArray();
		
		// 방법1
		for(char c:arr)
		{
			System.out.print(c + " ");
		}
		
		System.out.println();
		
		// 방법2
		System.out.print(Arrays.toString(arr));
		
		
	}
}

 

 

 

문자열 변경(3) → replace / replaceAll

 

 

public static void main(String[] args) {

		String data = "Hello String";
		
		// letter 변경
		String data_change = data.replace('l', 'k');
		
		System.out.println("data = " + data);
		System.out.println("data_change = " + data_change);
		
		// 단어 변경
		String data_change2 = data.replace("String", "Java");
		
		System.out.println("data_change2 = " + data_change2);
		
		System.out.println();
		
		
		// 특수 문자 변경
		String[] strData= {
				
			"Hello 1234",
			"Java? Data",
			"한글 자바 $",
			"12345 . data",
			"1234Java한글",
			"AAA|BBB",
			"한글^Data",
		};
		
		for(String ss:strData)
		{
			String s = ss.replaceAll("[^가-힣A-Za-z]", ""); // 한글, 알파벳 제외하고 제거
			System.out.println(s);
		}

		
	}
}

 

 

특수 문자

^ (startsWith): 시작
    ^[가-힣]: 한글로 시작한 문자열
    ^[a-z]: 소문자 시작
    ^[0-9]: 숫자 시작

    [^가-힣]: 한글 제외

-

$ (endsWith): 끝
	[A-Z]$: 끝나는 문자열 대문자

-

. : 임의의 문자

+ : ABC+ → ABC 다음에 1개 이상의 문자 포함
eg. 맛있는 맛있고 맛있게..
	맛있+
    
*: ABC* → ABC 다음에 0개 이상의 문자 포함

|: 선택 (2개 중에 1개 선택)

\ : 문자 자체를 읽어옴

 

 

 

 

3. 문자열 길이 제거

 

 

 

public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		
		System.out.print("문자열 입력: ");
		String data = sc.next();
		
		System.out.println("data: " + data);
		System.out.println("문자 개수: " + data.length());
		
		String s = "Hello"; // 문자 개수: 5
		String s1 = " Hello "; // 문자 개수: 7
		
		// 5로 변경
		System.out.println(s1.trim().length());
		
	}
}

 

 


 

 

문자열 배열_1

 

// split
[A, B, C, D, E, F, G, H]

// charAt() → 문자열 하나 하나씩 불러온다
A 
B 
C 
D 
E 
F 
G 
H

// toCharArray()
[A, B, C, D, E, F, G, H]

// new String()
일월화수목금토

// String.valueOf()
일월화수목금토

 

 

public static void main(String[] args) {

		String s = "ABCDEFGH";
		
		//split()
		String[] ss = s.split("");
		System.out.println("ss = " + Arrays.toString(ss));
		
		// charAt()
		for(int i=0; i<s.length(); i++)
		{
			System.out.print(s.charAt(i) + " ");
		}
		
		System.out.println();
		
		// toCharArray()
		char[] c = s.toCharArray();
		System.out.print("c=" + Arrays.toString(c));
		
		System.out.println();
		
		// 다른 방법
		char[] cc= {'일', '월', '화', '수', '목', '금', '토'};
		
		String sss=new String(cc);
		System.out.println(sss);	
		
		String sss2=String.valueOf(cc);
		System.out.println(sss2);
		}

 

 

 

 

문자열 배열_응용

 

 

1. 서울 여행_자연

 

===== 메뉴 =====
1. 목록 출력
2. 상세 보기
3. 명칭 검색
4. 주소 검색
5. 종료
===============
메뉴 선택:4
구/동 입력: 
강남
도산공원
06020 서울 강남구 도산대로45길 20 (도산전시관)

 

import java.util.Scanner;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class 서울여행_자연 {
    static String[] title=new String[120];
    static String[] msg=new String[120];
    static String[] address=new String[120];
    static {
    	// 변수 초기화 => 자동 호출 => 초기화(초기화 블록) 
    	try
    	{
    		//https://korean.visitseoul.net/nature?curPage=15
    		// <a>
    		int k=0;
    		for(int i=1;i<=15;i++) // 15페이지
    		{
    			Document doc=Jsoup.connect("https://korean.visitseoul.net/nature?curPage="+i).get();
    			Elements link=doc.select("ul.article-list li.Item a");
    			// class => 없으면 위에 태그 (class,id) => class => 태그.클래스명
    			
    			
    			for(int j=0;j<link.size();j++)
    			{
    				String temp="https://korean.visitseoul.net"+link.get(j).attr("href");
    				
    				System.out.println(link.get(j).attr("href"));
    				Document doc2=Jsoup.connect(temp).get();
    				
    				Element title1=doc2.selectFirst("h3.h3");
    				Element msg1=doc2.selectFirst("div.text-area");
    				Element address1=doc2.selectFirst("div.detail-map-wrap div.detail-map-infor dl dd");
    				
    				
    			    title[k]=title1.text();
    			    msg[k]=msg1.text();
    			    address[k]=address1.text();
    				k++;
    			}
    		}
    	}catch(Exception ex){}
    }
	public static void main(String[] args) {
		
        Scanner scan=new Scanner(System.in);
        
        // 메뉴 
        while(true)
        {
        	System.out.println("===== 메뉴 =====");
        	System.out.println("1. 목록 출력");
        	System.out.println("2. 상세 보기");
        	System.out.println("3. 명칭 검색");
        	System.out.println("4. 주소 검색");
        	System.out.println("5. 종료");
        	System.out.println("===============");
        	System.out.print("메뉴 선택:");
        	int menu=scan.nextInt();
        	if(menu==5)
        	{
        		System.out.println("프로그램 종료");
        		break;
        	}
        	else if(menu==1)
        	{
        		System.out.println("===== 서울 자연 & 관광 =====");
        		for(int i=0; i<title.length; i++)
        		{
        			if(title[i]!=null) // 목록에서 null인 값 제외하고 출력
        			{
        				System.out.println((i+1)+"."+title[i]);
        			}
        		}
        		
        	}
        	else if(menu==2)
        	{
        		
        		System.out.print("상세 보기 번호 입력(1-93): ");
        		int detail = scan.nextInt();
        		
        		System.out.println("장소: " + title[detail]);
        		System.out.println("소개: " + msg[detail]);
        		System.out.println("위치: " + address[detail]);
        		
        	}
        	else if(menu==3)
        	{
        		System.out.print("방문지 입력: ");
        		String loc=scan.next();
        		
        		
        		for(String s:title)
        		{
        			if(s!=null)
        			{
	        			if(s.contains(loc))
	        			{
	        				System.out.println("★" + s);
	        			}
        			}
        		}
        		
        	}
        	else if(menu==4)
        	{
        		System.out.println("구/동 입력: ");
        		String gu=scan.next();
        		try // try-catch: 오류 없애기
        		{
        		
        		for(int i=0; i<94; i++)
        		{
        			
	    			if(address[i].contains(gu)) // 주소를 입력해서
	    				{
	    					System.out.println(title[i]); // 그 주소의 title
	    					System.out.println(address[i]); // address 가져온다
	    					System.out.println("-------------------------------");
	    				}
		    		}
        		} catch(Exception ex) {}
		    }
        	else
        	{
        		System.out.println("없는 메뉴입니다!!");
        	}
        }
	}

}

 

 

 

2. 숫자 야구 게임

 

 

코드 수정 필요

public static void main(String[] args) {
		
		// 1. 변수 설정
		
		int[] com = new int[3]; // 난수
		int[] user = new int[3]; // 사용자 입력 값
	
		
		// 2. 변수 난수 발생 → 중복X
		int su=0; // 난수 저장하는 변수
		boolean bCheck=false; // 중복 여부 확인
		
		for(int i=0; i<3; i++)
		{
			// 중복 체크
			// bCheck=true → 다시 난수 발생
			// bCheck=false → com에 저장
			
			bCheck=true;
			while(bCheck)
			{
				// 난수 발생
				su=(int)(Math.random()*9)+1; // 1-9
				bCheck=false;
				
				// 비교 → 저장된 숫자 중복 여부
				for(int j=0; j<i; j++)
				{
					if(su==com[j])
					{
						bCheck=true; // while문 수행
						break;
					}
					
				}
			}
			
			com[i]=su;
		}
		System.out.println("com=" + Arrays.toString(com));
		
		
		
		
		// ----- 반복문 → while
		// 3. 사용자 입력
		// 3-1. 정상 입력 여부 확인 → continue; → if
		
		// 4. 난수 비교
		
		// 5. 힌트 제공
		
		// 6. 종료 여부 → break
		// -----
		
		Scanner sc=new Scanner(System.in);
		
		while(true)
		{
			System.out.print("세 자리 정수 입력: ");
			int input=sc.nextInt();
					
			// 오류 → 잘못된 입력일 때
			if(input<100 || input>999) // input>=100 && input <= 999
			{
				System.out.println("잘못된 입력입니다!!");
				continue; // while 조건식으로 이동
			}
			user[0]=input/100;
			user[1]=(input%100)/10;
			user[2]=input%10;
			// break; // 정상적인 입력시 빠져 나감
			
			// 같은 수 입력하면 안 됨
			if(user[0]==user[1] || user[0]==user[2] || user[1]==user[2])
			{
				System.out.println("같은 수는 입력할 수 없습니다.");
				continue;
			}
		
			// 오류 처리 → 0 포함하면 안 됨
			if(user[0]==0 || user[1]==0 || user[2]==0)
			{
				System.out.println("\"0\"은 사용할 수 없습니다.");
				continue;
			}
			
			// 비교
			int s=0, b=0;
			for(int i=0; i<3; i++) //com
			{
				for(int j=0; j<3; j++) //user
				{
					if(com[i]==user[j]) // 3개 다 구분 중
					{
						if(i==j)
							s++;
						else
							b++;
					}
				}
			}
			
			// 힌트
			System.out.printf("Input Number:%d, Result:%dS-%dB\n", input,s,b);
			
			// 종료 여부
			if(s==3)
			{
				System.out.println("Game Over");
				break;
			}
			
		}
		System.out.println("user=" + Arrays.toString(user));
	}