1. 如何在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 maxsu");}private static void printDistinctCharsWithCount(String input) {Map<Character, Integer> charsWithCountMap = new HashMap<>();// 使用Java 8中的Map合并方法for (char c : input.toCharArray())charsWithCountMap.merge(c, 1, Integer::sum);System.out.println(charsWithCountMap);// 另一种方法是使用最新的Java增强功能而不是for循环,但有点复杂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);}}
2. 编写一个java程序来反转String
有很多方法可以反转String,一些常见的是:
- 使用StringBuilder/StringBuffer类的reverse()方法;
- 使用char/byte数组并反向遍历并填充结果字符串;
但是,如果不确定输入String内容,应该使用StringBuilder内置的reverse()方法。因为使用char和byte数组可能会产生不需要的结果。
public class ReverseAString {public static void main(String[] args) {reverseInputString("abc");reverseInputString("ç©∆sd˚ø"); //special chars}private static void reverseInputString(String input) {StringBuilder sb = new StringBuilder(input);String result = sb.reverse().toString();System.out.println(result);}}
3. 如何检查字符串是否是回文?
回文串是反向串也是相同的串。所以可以反转输入字符串并检查两个字符串是否相等。或者可以使用String charAt(int index)方法来检查回文串。
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);}}
4. 如何删除字符串中所有出现的给定字符?
String类中没有remove函数,但在这种情况下可以使用replaceAll()。这是一个简单的程序,演示了如何做到这一点。
public class RemoveCharFromString {public static void main(String[] args) {removeCharFromString("abcbcdjfkd", 'c');removeCharFromString("Maxsu", 'a');removeCharFromString("ç∂©∂ç", '©');}private static void removeCharFromString(String input, char c) {String result = input.replaceAll(String.valueOf(c), "");System.out.println(result);}}
5. 如何以编程方式证明String是不可变的?
我们知道String在java中是不可变的,但新开发人员仍然对此感到困惑。试着理解这种混乱的原因。
String s1 = "Java";s1 = "Python"
在上面的代码片段中,s1值已经改变,它是一个String对象。那么怎么能说String是不可变的呢?
要理解的最重要的一点是如何在java中创建字符串。当使用字符串文字创建String时,它不会更改原始String的值。它在字符串池中创建一个新的String并更改该变量的引用。所以原始字符串值永远不会改变,这就是字符串不可变的原因。
public class StringImmutabilityTest {public static void main(String[] args) {String s1 = "Java"; String s2 = s1;System.out.println(s1 == s2);s1 = "Python"; System.out.println(s1 == s2); System.out.println(s2); }
}
6. 编写一个程序来计算字符串中的单词数量?
这个程序的简单解决方案似乎是input.split(" ").length,但是如果字符串没有正确格式化并且它包含前导和尾随空格,重复多个空格和制表符,这将不起作用。
幸运的是,String split()函数将正则表达式作为参数,可以使用它来计算字符串中的单词数。
public class CountNumberOfWordsInString {public static void main(String[] args) {countNumberOfWords("My name is Maxsu");countNumberOfWords("I Love Java Programming");countNumberOfWords(" This is not properly formatted line ");}private static void countNumberOfWords(String line) {String trimmedLine = line.trim();int count = trimmedLine.isEmpty() ? 0 : trimmedLine.split("\\s+").length;System.out.println(count);}
}
7. 编写一个程序来检查是否创建了两个具有相同字符的字符串?
首先,必须从输入字符串创建一组字符。然后使用Set equals()方法检查它们是否包含相同的字符。这是一个简单的程序,用于检查是否使用相同的字符创建了两个字符串。
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));}}
8. 读取两个String用户输入并检查是否第一个包含第二个?
这是一个简单的程序,可以使用String contains()方法来检查指定的字符串是否是此字符串的一部分。但是,需要使用Scanner类来读取用户输入。
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:
Maxsu
Enter Second String:
su
Maxsu contains su = true
9. 如何在不使用第三个变量的情况下交换两个字符串?
可以使用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+s2container.setSecondString(container.getFirstString().substring(0, container.getFirstString().length()-container.getSecondString().length())); // s2=s1container.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;}@Overridepublic 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
10. 编写一个程序,从输入字符串中找出第一个非重复字符?
参考示例代码
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 founddiscardedChars.add(c);break;} else if (j == chars.length - 1) { // no match found till endreturn c;}}}return null;}
}