字串是Java程式設計中最廣泛使用的類別。這就是為什麼在Java面試中使用字串程式來評估編碼技能的原因。
Java中的字串程式
在這裡,我提供了一些Java中的字串程式,以幫助你提升編碼技能。在查看答案之前,請嘗試自己解決這些問題,以更好地學習。我正在嘗試使用Java引入的所有最新功能,如流、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);
// 另一種方法使用最新的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()
方法 - 使用字符/字節數組並反向遍歷,然後填充結果字符串
但是,如果您不確定輸入字符串的內容,請始終使用StringBuilder內置的reverse()方法。因為使用字符和字節數組可能會產生意外的結果。我在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);
}
}
編寫一個程序來檢查兩個字符串是否由相同的字符創建?
首先,我們需要從輸入字符串創建一個字符集。然後使用字符集的 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。
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