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 리포지토리에서 예제를 다운로드할 수 있습니다.