Java での文字列プログラム

Stringは、Javaプログラミングで最も広く使用されるクラスです。そのため、StringプログラムはJavaの面接でコーディングスキルを評価するために使用されます。

JavaにおけるStringプログラム

ここでは、JavaでのいくつかのStringプログラムを提供しています。これらの問題については、回答を確認する前に自分で解いてみて、より良い方法で学習してください。私は、Streamラムダ式関数型インターフェースなど、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 charsWithCountMap = new HashMap<>();

		// Java 8のMap mergeメソッドを使用する方法
		for (char c : input.toCharArray())
			charsWithCountMap.merge(c, 1, Integer::sum);
		System.out.println(charsWithCountMap);

		// より最新のJavaの機能を使用し、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);

	}

}

Javaプログラムを作成して、文字列を逆にする方法を教えてください。

文字列を逆にする方法はいくつかあります。一部の一般的な方法は次のとおりです:

  • 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);
		
	}

}

入力文字列から指定された文字のすべての出現を削除する方法はありますか?

Stringクラスには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がプログラム上で不変であることを証明する方法はありますか?

私たちはJavaではStringが不変であることを知っていますが、それにもかかわらず新しい開発者はまだ混乱しています。この混乱の理由を理解しましょう。

String s1 = "Java";

s1 = "Python"; 

上記のコードスニペットでは、s1の値が変更され、これはStringオブジェクトです。では、なぜStringが不変であると言えるのでしょうか?理解するためには、Javaで文字列がどのように作成されるかを理解することが最も重要です。文字列リテラルを使用して文字列を作成すると、元の文字列の値は変更されません。代わりに、文字列プール内に新しい文字列が作成され、変数の参照が変更されます。したがって、元の文字列の値は変更されないため、文字列は不変です。以下のプログラムは、この概念を証明します。コメントを読んでコンセプトを正しく理解してください。

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の値が変更されたため、Stringは不変ですか?
		
		//上記の場合、新しい文字列「Python」がプールに作成されました
		//s1は今やプール内の新しい文字列を参照しています 
		//しかし、元の文字列「Java」は変更されずにプールに残っています
		//s2はまだプール内の元の文字列「Java」を参照しています
		
		//s1とs2が異なる参照を持っていることの証拠
		System.out.println(s1 == s2); 
		
		System.out.println(s2); 
		//元の文字列の値が変更されていないことを示す「Java」が表示されます。したがって、Stringは不変です
		
	}

}

文字列内の単語の数を数えるプログラムを作成してください。

このプログラムの簡単な解決策は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);
	}

}

2つの文字列が同じ文字で作成されているかどうかをチェックするプログラムを作成しますか?

まず、入力された文字列から文字のセットを作成する必要があります。次に、セットのequals()メソッドを使用して、同じ文字を含んでいるかどうかを確認します。以下は、2つの文字列が同じ文字で作成されているかどうかをチェックするためのシンプルなプログラムです。

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));
	}

}

2つの文字列のユーザー入力を読み取り、最初の文字列が2番目の文字列を含んでいるかどうかをチェックします。

これはシンプルなプログラムで、指定された文字列がこの文字列の一部であるかどうかを確認するために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

3番目の変数を使用せずに2つの文字列を入れ替える方法はありますか?

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;
	}

}

文字列が数字のみを含んでいるかをチェックする方法を2つ提供してください。

正規表現を使用して文字列が数値であるかどうかをチェックすることができます。もう1つの方法は、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);
		}
		
	}

}

文字列のディープコピーの方法

文字列は変更不可能なので、ディープコピーまたはシャローコピーの心配は必要ありません。単純に代入演算子(=)を使用して、1つの文字列を別の文字列にコピーすることができます。詳細については、Javaの文字列のコピーを参照してください。

例は私のGitHubリポジトリからダウンロードできます。

Source:
https://www.digitalocean.com/community/tutorials/string-programs-in-java