Programmers/JAVA

[ 문자열 중복제거 ] , [ 문자배열 중복제거 ]

giggs 2022. 12. 31. 08:31

 

-- INDEX --

 

1. 문자열 중복제거 2. 문자배열 중복제거 3. Method 체크
indexOf() 활용
contains() 활용
LinkedHashSet 활용 indexOf()
toCharArrays()
contains()
String.valueOf()
Arrays메소드
{ asList(), toString(), copyOf(), Sort() }

 

 

 


 

 

 

1. 문자열 중복제거

 

 

1-1 : if (str.indexOf(str.charAt(i)) == i )  answer += str.charAt(i);

  • 문자열에서 해당 문자의 index를 구해서
  • 중복 없는 처음이라면 더해주기
  • 중복이라면 더해주지 않는다.

 

public class main {

	public static void main(String[] args) {
		
			Scanner scanner = new Scanner(System.in);
			String str = scanner.next();	
			System.out.println(solution(str));
		
	}//main
	
	private static String solution(String str) {
		String answer = "";
		for (int i=0; i<str.length(); i++) {
			if (str.indexOf(str.charAt(i))==i) answer += str.charAt(i);
		}
		
		return answer;
	}

}//class


//aaadddeeefff 입력 -- adef 출력

 

 


 

 

1-2 : for (char x : c) { if (!answer.contains(String.valueOf(x))) answer += x; }

  • String.valueof(x) ----> Char x를 String x로 형 변환
  • 문자열에서 해당 문자열을 포함하고있지 않다면 더해주기
  • 문자열에서 해당 문자열을 이미 포함하고있다면 더해주지 않는다.

 

public class main {

	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		String str = scanner.next();
		System.out.println(solution(str));
		
	}//main
	
	private static String solution(String str) {
		String answer = "";
		char[] c = str.toCharArray();
		for (char x : c) {
			if (!answer.contains(String.valueOf(x))) answer += x;
		}
		
		return answer;
	}

}//class

//aaadddeeefff 입력 -- adef 출력

 

 

 


 

 

 

2. 문자배열 중복제거

 

 

 

2-1: LinkedHashSet

  • Set인터페이스를 구현하고 Hash Set클래스를 상속받은 Linked List입니다. 
  • HashSet과 동일하게 데이터 중복을 허용하지 않으며,
  • 중복 입력을 할 경우 나중에 입력된 데이터는 입력되지 않는다.
  • HashSet과 동일한 구조로 LinkedHashSet은 삽입된 순서대로 반복한다.
  • HashSet은 순서를 관리하지 않아 값을 출력할 때마다 다른 순서대로 출력이 된다.
  • iteration 작업을 할 경우, Set에 삽입된 순서대로 접근한다.
  • .add(Object) , remove(Object) , clear() , size() ,  iterator() , clone() , contains(Object)
  • null element를 허용한다.
  • Performance는 HashSet보다 약간 떨어진다고 함.

 

 


 

 

2-2 : LinkedHashSet 선언

  • 선언 : LinkedHashSet<타입> 변수명 = new LinkedHashSet<타입>();
  • 타입은 클래스, Integer, String, Character 등 다양한 방식으로 선언이 가능
  • LinkedHashSet<String> linkHS = new LinkedHashSet<String>(Arrays.asList(my_string));
  • Arrays.asList(String[ ]) -----> 배열을 ArrayList로 변환해 준다. 

 

 

		String[] my_string = {"B","B","C","C"};
		
		LinkedHashSet<String> linkHS = new LinkedHashSet<String>(Arrays.asList(my_string));
		
		String[] answer = linkHS.toArray(new String[] {});
		
		System.out.println(Arrays.toString(answer));
        
        //출력결과 [ B, C ]

 

 

 

 


 

 

 

 

3. Method Check

 

 

3-1 : indexOf ()

  • 문자열 내에서 특정한 문자열의 index값을 return
  • 문법 : stringValue.indexOf(searchValue, [fromIndex])
  • searchValue - String, 필수, 탐색하고 싶은 문자열
  • fromIndex - Integer(0<fromIndex<stringValue.length-1), 옵션
  • stringValue에서 특정한 문자열의 위치(index)를 반환한다.
  • 탐색하려는 문자열이 존재하지 않는다면 -1을 반환한다.

 


 

3-2 : toCharArray()

  • String(문자열)을 char형 배열로 바꾼다.
  • 문자열을 한 글자씩 쪼개서 이를 char타입의 배열에 집어넣어 주는 메소드.
  • 문자열의 각 문자 (즉, 각 Char 개체)를 문자 배열에 복사.
  • 복사한 첫 번째 문자가 반환된 문자 배열의 인덱스는 0
  • 복사한 마지막 문자의 인덱스는 Array.Length -1
  • 문법 : String s1 = "Hello World";
              char[] charArr = s1.toCharArray();
  • 문자 배열의 문자에서 문자열을 만들려면 생성자를 호출 - String(Char[ ]) 

 


 

3-3 : contains()

  • 대상 문자열에 특정 문자열이 포함되어 있는지 확인하는 함수이다.
  • 문법 : boolean contains(CharSequence s)
  • 대/소문자를 구분한다.
  • 공백도 체크한다.
  • return 값은 true || false

 


 

3-4 : String.valueOf()

  • valueOf(boolean) / valueOf(double) / valueOf(float) / valueOf(int) 등
  • () 괄호 안의 해당 객체를 String 객체로 변환시키는 역할을 한다. 말 그대로 String의 객체로 형변환.
  • String.valueOf() - 파라미터가 null이면 문자열 "null"을 만들어서 반환한다.
  • toString() - 대상 값이 null이면 NPE를 발생시키고 Object에 담긴 값이 String이 아니어도 출력한다.
  • 두 가지 메서드(valueOf() 와 toString())의 차이점은 null값에 따른 NPE의 발생 유무이다.
  • 이런 차이점 때문에 valueOf의 null체크 방법은 "null".equals(string) 형태로 체크를 해야 한다.
  • null로 인해 발생된 에러는 시간이 지나고, 타인의 소스인 경우 디버깅하기 어렵고 어떤 의미를 내포하고 있는지 판단하기 어렵다. 때문에 NPE를 방지하기 위해 toString보다는 valueOf를 사용하는 것을 추천
  • return 값은 String

 

 


 

 

3-5 : Arrays 메소드

 
 

3-5-1 : Arrays.asList(T..a) :

  • 배열을 ArrayList로 변환해 준다. 
  • 배열은 크기가 정해져 있고 값의 삭제 등이 자유롭지 않아 불편한 점이 많다.
  • asList()를 사용하여 리스트로 변환한 후
  • 체인메소드(chain method) 방식으로
  • ArrayList의 메소드를 더하여 활용하면 여러모로 편리한 점이 많다.
 
 

 

3-5-2 : Arrays.toString() 

  • 배열에도 toString이 존재한다.
  • 배열 자체에서 toString()을 사용하면 배열의 내용이 아니라 배열의 주소값이 출력된다.
  • 배열의 내용을 출력하려면 Arrays.toString(배열)을 사용해야 한다.

 

 


 


3-5-3 : Arrays.copyOf(array, int newlength)

  • 배열을 복사한다.
  • 특정 배열의 원하는 길이만큼 새로운 배열로 복사하는 함수
  • 새로운 배열 = Arrays.copyOf(원본 배열, 원본 배열에서 복사하고 싶은 요소들의 길이);
  • 복사받는 배열(arr3)이 복사하는 배열(arr1)보다 범위를 크게 지정해 주면
  • 해당 초과하는 범위는 배열타입의 default 값이 들어가게 된다. 
  • 다른 배열을 복사 방법도 체크
  • { Object.clone, Arrays.copyOf, Arrays.copyOfRange, System.arrayCopy }

 

 


 

 

3-5-3 : Arrays.Sort(array) 

  • 정렬은 쓰이는 곳이 굉장히 많은데 기본적으로 Sort()를 하면 오름차순 정렬이 된다.
  • 정수형 배열을 내림차순 정렬하고 싶으면
  • 반복문으로 배열을 뒤에서부터 꺼내 담아주거나 하는 방식을 사용할 수 있다.

 

Sort(array, Comparator)

  • Collections.reverseOrder() 라는 메소드가 있는데, sort의 첫 번째 파라미터에 문자형 배열을 담고 두 번째 파라미터에 Collections.reverseOrder() 를 담으면 문자형 배열을 내림차순 정렬해 준다.

 

Sort(array, int fromindex, int toindex)
  • 인덱스의 시작과 끝을 정해 fromindex부터 toindex-1까지만 오름차순 정렬할 수도 있다.

 

Sort(array, int fromindex, int toindex, Comparator)
  • 두 번째와 세 번째를 조합할 수도 있다! 

 

 

import java.util.Arrays;
import java.util.Collections;
public class Arrays_ {
      public static void main(String[] args) {
            String[] a = {"a","b","c","d"};
            int[] b = {1,5,5,7,3,3,42,6,8,45323,4,63,2,1};
            System.out.println(Arrays.asList(a)); //List로
            
            Arrays.sort(b,4,14); //인덱스정렬
            System.out.println(Arrays.toString(b));
            
            Arrays.sort(b); //오름차순정렬
            
            System.out.println(Arrays.toString(b)); // string으로
            Arrays.sort(a, Collections.reverseOrder()); //문자형 배열을 거꾸로
            System.out.println(Arrays.toString(a));
            
            Arrays.sort(a);
            Arrays.sort(a, 2,4,Collections.reverseOrder());
            System.out.println(Arrays.toString(a));
            
            String[] cc = {"11","12","13","23","53","223","145","53"};
            Arrays.sort(cc, Collections.reverseOrder());
            System.out.println(Arrays.toString(cc));
            int[] c = Arrays.copyOf(b, 5); //복사
            System.out.println(Arrays.toString(c));
            
            String[] d = Arrays.copyOf(a, 2);
            System.out.println(Arrays.toString(d));
            
      }
}
[a, b, c, d]
[1, 5, 5, 7, 1, 2, 3, 3, 4, 6, 8, 42, 63, 45323]
[1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 8, 42, 63, 45323]
[d, c, b, a]
[a, b, d, c]
[53, 53, 23, 223, 145, 13, 12, 11]
[1, 1, 2, 3, 3]