웹사이트 검색

Java의 문자열 프로그램


String은 Java 프로그래밍에서 가장 널리 사용되는 클래스입니다. 이것이 코딩 기술에 액세스하기 위해 Java 인터뷰에서 문자열 프로그램이 사용되는 이유입니다.

Java의 문자열 프로그램

여기서는 코딩 기술을 연마하는 데 도움이 되는 자바 문자열 프로그램을 제공하고 있습니다. 더 나은 방법으로 배우기 위해 답변을 확인하기 전에 이러한 질문을 직접 해결해 보십시오. 기능 인터페이스 등과 같이 Java에 도입된 모든 최신 기능을 사용하려고 합니다.

문자열에서 고유 문자와 그 개수를 얻는 방법은 무엇입니까?

package com.journaldev.java.string;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class DistinctCharsCount {

	public static void main(String[] args) {

		printDistinctCharsWithCount("abc");
		printDistinctCharsWithCount("abcab3");
		printDistinctCharsWithCount("hi there, i am pankaj");
	}

	private static void printDistinctCharsWithCount(String input) {
		Map<Character, Integer> charsWithCountMap = new HashMap<>();

		// using Map merge method from Java 8
		for (char c : input.toCharArray())
			charsWithCountMap.merge(c, 1, Integer::sum);
		System.out.println(charsWithCountMap);

		// another way using latest Java enhancements and no for loop, a bit complex though
		List<Character> list = input.chars().mapToObj(c -> (char) c).collect(Collectors.toList());

		list.stream().forEach(c -> charsWithCountMap.merge(c, 1, Integer::sum));

		System.out.println(charsWithCountMap);

	}

}

문자열을 뒤집는 Java 프로그램을 작성 하시겠습니까?

문자열을 뒤집는 방법에는 여러 가지가 있습니다. 일반적인 것 중 일부는 다음과 같습니다.

  • StringBuilder/StringBuffer reverse() 메서드
  • 문자/바이트 배열을 사용하고 역방향으로 트래버스하여 결과 문자열 채우기

그러나 입력 문자열 내용이 확실하지 않은 경우 항상 StringBuilder 내장 reverse() 메서드를 사용하십시오. 문자 및 바이트 배열을 사용하면 원하지 않는 결과가 발생할 수 있기 때문입니다. Reverse a String in Java에서 이에 대한 완전한 설명을 제공했습니다.

package com.journaldev.java.string;

public class ReverseAString {

	public static void main(String[] args) {

		reverseInputString("abc");
		reverseInputString("ç©∆˙¨˚ø"); //special chars
	}

	private static void reverseInputString(String input) {
		StringBuilder sb = new StringBuilder(input);
		String result = sb.reverse().toString();
		System.out.println(result);
	}

}

문자열이 Palindrome인지 확인하는 방법은 무엇입니까?

팰린드롬 문자열은 반대 문자열도 같은 문자열입니다. 따라서 입력 문자열을 뒤집고 두 문자열이 동일한지 확인할 수 있습니다. 또는 현명하게 String charAt(int index) 메서드를 사용하여 회문 문자열을 확인할 수 있습니다.

package com.journaldev.java.string;

public class PalindromeString {

	public static void main(String[] args) {
		
		checkPalindromeString("abc");
		checkPalindromeString("abcba");
		checkPalindromeString("ç∂©∂ç");
	}

	private static void checkPalindromeString(String input) {
		boolean result = true;
		int length = input.length();
		for(int i=0; i < length/2; i++) {
			if(input.charAt(i) != input.charAt(length-i-1)) {
				result = false;
				break;
			}
		}
		System.out.println(input + " is palindrome = "+result);
		
	}

}

입력 문자열에서 주어진 문자의 모든 항목을 제거하는 방법은 무엇입니까?

String 클래스에는 제거 기능이 없지만 이 경우 replaceAll()을 사용할 수 있습니다. 다음은 이를 수행하는 방법을 보여주는 간단한 프로그램입니다.

package com.journaldev.java.string;

public class RemoveCharFromString {

	public static void main(String[] args) {

		removeCharFromString("abcbcdjfkd", 'c');
		removeCharFromString("Pankaj", 'a');
		removeCharFromString("ç∂©∂ç", '©');

	}

	private static void removeCharFromString(String input, char c) {
		String result = input.replaceAll(String.valueOf(c), "");
		System.out.println(result);
	}

}

문자열이 프로그래밍 방식으로 변경 불가능함을 증명하는 방법은 무엇입니까?

우리는 String이 Java에서 불변이라는 것을 알고 있지만, 새로운 개발자는 여전히 이것과 혼동합니다. 이 혼란의 이유를 이해하려고 노력합시다.

String s1 = "Java";

s1 = "Python"; 

위의 코드 조각에서 우리는 s1 값이 변경되었고 이것이 String 개체라고 말할 수 있습니다. 그렇다면 String이 불변이라고 어떻게 말할 수 있습니까? 이해해야 할 가장 중요한 점은 자바에서 문자열이 생성되는 방식입니다. 문자열 리터럴을 사용하여 문자열을 만들면 원래 문자열의 값이 변경되지 않습니다. 문자열 풀에 새 문자열을 만들고 변수의 참조를 변경합니다. 따라서 원래 문자열 값은 절대 변경되지 않으며 이것이 문자열이 불변인 이유입니다. 아래 프로그램은 우리의 진술을 증명하고 개념을 올바르게 이해하기 위해 주석을 읽으십시오.

package com.journaldev.java.string;

public class StringImmutabilityTest {

	public static void main(String[] args) {

		String s1 = "Java"; // "Java" String created in pool and reference assigned to s1
		
		String s2 = s1; //s2 is also having the same reference to "Java" in the pool
		
		System.out.println(s1 == s2); // proof that s1 and s2 have same reference
		
		s1 = "Python"; 
		//s1 value got changed above, so how String is immutable?
		
		//well, in above case a new String "Python" got created in the pool
		//s1 is now referring to the new String in the pool 
		//BUT, the original String "Java" is still unchanged and remains in the pool
		//s2 is still referring to the original String "Java" in the pool
		
		// proof that s1 and s2 have different reference
		System.out.println(s1 == s2); 
		
		System.out.println(s2); 
		// prints "Java" supporting the fact that original String value is unchanged, hence String is immutable
		
	}

}

문자열의 단어 수를 세는 프로그램을 작성하시겠습니까?

이 프로그램에 대한 간단한 해결책은 input.split(\ \).length인 것 같지만 문자열 형식이 올바르지 않고 선행 및 후행 공백이 포함되어 있고 여러 공백이 중복되어 있으면 작동하지 않습니다. 탭. 운 좋게도 정규식을 인수로 사용하여 문자열의 단어 수를 계산할 수 있습니다.

package com.journaldev.java.string;

public class CountNumberOfWordsInString {

	public static void main(String[] args) {
		
		countNumberOfWords("My name is Pankaj");
		countNumberOfWords("I Love Java Programming");
		countNumberOfWords(" This	is  not   properly formatted		line ");

	}

	private static void countNumberOfWords(String line) {
		//System.out.println(line.split(" ").length); //won't work with tabs and multiple spaces
		
		String trimmedLine = line.trim();
		int count = trimmedLine.isEmpty() ? 0 : trimmedLine.split("\\s+").length;
		
		System.out.println(count);
	}

}

두 문자열이 동일한 문자로 생성되었는지 확인하는 프로그램을 작성하시겠습니까?

우선 입력 문자열에서 문자 집합을 만들어야 합니다. 그런 다음 Set equals() 메서드를 사용하여 동일한 문자가 포함되어 있는지 확인합니다. 다음은 동일한 문자로 두 개의 문자열이 생성되었는지 확인하는 간단한 프로그램입니다.

package com.journaldev.java.string;

import java.util.Set;
import java.util.stream.Collectors;

public class CheckSameCharsInString {

	public static void main(String[] args) {
		sameCharsStrings("abc", "cba");
		sameCharsStrings("aabbcc", "abc");
		sameCharsStrings("abcd", "abc");
		sameCharsStrings("11", "1122");
		sameCharsStrings("1122", "11");	
	}

	private static void sameCharsStrings(String s1, String s2) {

		Set<Character> set1 = s1.chars().mapToObj(c -> (char) c).collect(Collectors.toSet());
		Set<Character> set2 = s2.chars().mapToObj(c -> (char) c).collect(Collectors.toSet());
		System.out.println(set1.equals(set2));
	}

}

두 개의 문자열 사용자 입력을 읽고 첫 번째에 두 번째가 포함되어 있는지 확인하시겠습니까?

이것은 간단한 프로그램이며 String contains() 메서드를 사용하여 지정된 문자열이 이 문자열의 일부인지 확인할 수 있습니다. 그러나 사용자 입력을 읽으려면 스캐너 클래스를 사용해야 합니다.

package com.journaldev.java.string;

import java.util.Scanner;

public class StringContainsSubstring {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("Enter First String:");
		String s1 = scanner.nextLine();
		
		System.out.println("Enter Second String:");
		String s2 = scanner.nextLine();
		
		scanner.close();
		
		boolean result = stringContainsSubstring(s1, s2);
		System.out.println(s1+" contains "+s2+" = "+result);
	}

	private static boolean stringContainsSubstring(String string, String substring) {
		boolean result = false;
		result = string.contains(substring);
		return result;
	}

}

다음은 위 프로그램의 샘플 출력입니다.

Enter First String:
Pankaj
Enter Second String:
an
Pankaj contains an = true

세 번째 변수를 사용하지 않고 두 문자열을 바꾸는 방법은 무엇입니까?

String substring() 메서드를 사용하여 이를 수행할 수 있습니다. 다음은 이를 보여주는 간단한 코드 스니펫입니다.

String s1 = "abc";
String s2 = "def";

s1 = s1.concat(s2);
s2 = s1.substring(0,s1.length()-s2.length());
s1 = s1.substring(s2.length());

이를 위해 함수를 작성해야 한다면 어떻게 될까요? String은 변경할 수 없기 때문에 메서드에서 String 참조 값의 변경 사항은 메서드가 종료되는 즉시 사라집니다. 또한 우리는 java의 메소드에서 여러 객체를 반환할 수 없습니다. 따라서 입력 문자열을 보관할 컨테이너를 만든 다음 메서드에서 위의 논리를 수행해야 합니다. 아래 코드는 이것이 어떻게 수행될 수 있는지 보여줍니다. 복잡해 보일 수 있지만 논리는 위와 동일합니다.

package com.journaldev.java.string;

import java.util.Scanner;

public class SwapTwoStrings {

	public static void main(String[] args) {
		
		Container container = new Container();
		Scanner scanner = new Scanner(System.in);
		System.out.println("Enter First String:");
		container.setFirstString(scanner.nextLine());
		
		System.out.println("Enter Second String:");
		container.setSecondString(scanner.nextLine());
		scanner.close();
		System.out.println(container);
		container = swapStrings(container);
		System.out.println(container);
	}

	private static Container swapStrings(Container container) {
		container.setFirstString(container.getFirstString().concat(container.getSecondString())); //s1 = s1+s2
		container.setSecondString(container.getFirstString().substring(0, container.getFirstString().length()-container.getSecondString().length())); // s2=s1
		container.setFirstString(container.getFirstString().substring(container.getSecondString().length()));
		return container;
	}

}

class Container{
	private String firstString;
	private String secondString;
	
	public String getFirstString() {
		return firstString;
	}
	public void setFirstString(String firstString) {
		this.firstString = firstString;
	}
	public String getSecondString() {
		return secondString;
	}
	public void setSecondString(String secondString) {
		this.secondString = secondString;
	}
	
	@Override
	public String toString() {
		return "First String = "+firstString+", Second String = "+secondString;
	}
}

샘플 출력:

Enter First String:
Java
Enter Second String:
Python
First String = Java, Second String = Python
First String = Python, Second String = Java

입력 문자열에서 반복되지 않는 첫 번째 문자를 찾는 프로그램을 작성하시오?

package com.journaldev.java.string;

import java.util.ArrayList;
import java.util.List;

public class FindNonRepeatingChar {

	public static void main(String[] args) {

		System.out.println(printFirstNonRepeatingChar("abcaabcdedxy"));
		System.out.println(printFirstNonRepeatingChar("abca"));
		System.out.println(printFirstNonRepeatingChar("aaa"));

	}

	private static Character printFirstNonRepeatingChar(String string) {
		char[] chars = string.toCharArray();

		List<Character> discardedChars = new ArrayList<>();

		for (int i = 0; i < chars.length; i++) {
			char c = chars[i];

			if (discardedChars.contains(c))
				continue;

			for (int j = i + 1; j < chars.length; j++) {
				if (c == chars[j]) { // match found
					discardedChars.add(c);
					break;
				} else if (j == chars.length - 1) { // no match found till end
					return c;
				}
			}
		}
		return null;
	}

}

문자열에 숫자만 포함되어 있는지 확인하는 두 가지 방법을 제공합니까?

정규식을 사용하여 문자열이 숫자인지 여부를 확인할 수 있습니다. 또 다른 방법은 Long으로 구문 분석하는 것이며 숫자가 아닌 문자열인 경우 NumberFormatException을 발생시킵니다.

package com.journaldev.java.string;

public class CheckIfStringContainsDigitsOnly {

	public static void main(String[] args) {
		digitsOnlyString("111");
		digitsOnlyString("111a 1");
		digitsOnlyString("111 222");
		digitsOnlyString("111L");

	}

	private static void digitsOnlyString(String string) {
		if(string.matches("\\d+")) System.out.println("Digit Only String ::"+string);
		
		try {
			long l = Long.parseLong(string);
			System.out.println("Digit Only String ::"+string);
		}catch(Exception e){
			System.out.println("Non Digit Only String ::"+string);
		}
		
	}

}

문자열에 대해 딥 카피를 수행하는 방법은 무엇입니까?

문자열은 변경할 수 없으므로 깊은 복사 또는 얕은 복사에 대해 걱정할 필요가 없습니다. 간단히 대입 연산자(=)를 사용하여 한 문자열을 다른 문자열로 복사할 수 있습니다. 자세한 내용은 Java 문자열 복사를 참조하십시오.

내 GitHub 리포지토리에서 예제를 다운로드할 수 있습니다.