문자열은 자바 프로그래밍에서 가장 널리 사용되는 클래스입니다. 이것이 자바 면접에서 String 프로그램이 코딩 스킬에 접근하는 데 사용되는 이유입니다.
Java에서의 문자열 프로그램
여기에서 자바의 몇 가지 문자열 프로그램을 제공하여 코딩 스킬을 갱신하는 데 도움이 되도록 했습니다. 답을 확인하기 전에 이러한 문제를 스스로 해결하려고 노력하십시오. 더 나은 방법으로 학습하기 위해 자바에서 소개된 최신 기능을 모두 사용하려고 합니다. 예를 들어, Stream, lambda 표현식, 함수형 인터페이스 등이 있습니다.
문자열에서 고유한 문자 및 해당 수를 어떻게 얻을 수 있을까요?
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 charsWithCountMap = new HashMap<>();
// Java 8의 Map 병합 메서드 사용
for (char c : input.toCharArray())
charsWithCountMap.merge(c, 1, Integer::sum);
System.out.println(charsWithCountMap);
// 최신 자바 향상 기능 및 for 루프 없이 다른 방법, 조금 복잡하지만
List list = input.chars().mapToObj(c -> (char) c).collect(Collectors.toList());
list.stream().forEach(c -> charsWithCountMap.merge(c, 1, Integer::sum));
System.out.println(charsWithCountMap);
}
}
자바 프로그램을 작성하여 문자열을 뒤집는 방법에 대해 설명해주세요.
문자열을 뒤집는 여러 가지 방법이 있습니다. 일반적인 방법 중 일부는 다음과 같습니다:
- StringBuilder/StringBuffer의
reverse()
메서드 - char/byte 배열을 사용하여 반대 방향으로 순회하고 결과 문자열을 채우는 방법
그러나 입력 문자열 내용을 확신할 수 없는 경우에는 항상 StringBuilder 내장 reverse() 메서드를 사용하는 것이 좋습니다. 왜냐하면 char와 byte 배열을 사용하면 원하지 않는 결과가 발생할 수 있습니다. 이에 대한 자세한 설명은 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);
}
}
문자열이 회문인지 확인하는 방법은 무엇인가요?
A palindrome string is one whose reverse is also same string. So we can reverse the input string and check if both strings are equal for this. Or we can be smart and use the String charAt(int index)
method to check for palindrome string.
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);
}
}
입력 문자열에서 지정된 문자의 모든 발생을 제거하는 방법은 무엇인가요?
문자열 클래스에는 remove 함수가 없지만, 이 경우 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 s1 = "Java";
s1 = "Python";
위의 코드 조각에서 s1 값이 변경되었다고 말할 수 있습니다. 그것은 문자열 객체입니다. 그렇다면 어떻게 문자열이 불변하다고 말할 수 있을까요? 자바에서 문자열을 만드는 방법을 이해하는 것이 가장 중요합니다. 문자열 리터럴을 사용하여 문자열을 만들 때 원래 문자열의 값이 변경되지 않습니다. 이것은 문자열 풀에서 새로운 문자열을 만들고 변수의 참조를 변경합니다. 따라서 원래 문자열 값이 변경되지 않으며 그래서 문자열은 불변입니다. 아래 프로그램은 이 명제를 증명합니다. 컨셉을 정확히 이해하기 위해 주석을 읽어보세요.
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 값이 변경되었으므로 문자열이 왜 불변인가요?
//위의 경우에 "Python"이라는 새로운 문자열이 풀에 생성되었습니다.
//s1은 이제 풀에서 새로운 문자열을 참조하고 있습니다.
//하지만, 원래 문자열 "Java"는 여전히 변경되지 않았으며 풀에 그대로 남아 있습니다.
//s2는 여전히 풀에 있는 원래 문자열 "Java"를 참조하고 있습니다.
//s1과 s2가 서로 다른 참조를 가지고 있다는 것을 증명합니다.
System.out.println(s1 == s2);
System.out.println(s2);
//원래 문자열 값이 변경되지 않았으므로 "Java"를 출력하고, 따라서 문자열은 불변이라는 것을 지원합니다.
}
}
문자열에서 단어 수를 세는 프로그램을 작성하려면 어떻게 해야 하나요?
이 프로그램에 대한 간단한 해결책은 input.split(" ").length
로 보입니다. 하지만 문자열이 제대로 포맷되지 않고 선행 및 후행 공백, 중복된 여러 공백 및 탭이 포함되어 있으면 이것은 작동하지 않습니다. 다행히 String split() 함수는 정규 표현식을 인수로 사용할 수 있으며 이를 사용하여 문자열의 단어 수를 세는 데 사용할 수 있습니다.
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); //탭과 여러 공백과 함께 작동하지 않습니다
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()
메서드를 사용하여 지정된 문자열이 이 문자열의 일부인지 확인할 수 있습니다. 그러나 사용자 입력을 읽으려면 Scanner 클래스를 사용해야합니다.
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`을 throw할 것입니다.
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 저장소에서 다운로드할 수 있습니다.
Source:
https://www.digitalocean.com/community/tutorials/string-programs-in-java