Java 中的字符串程序

String 是 Java 编程中最广泛使用的类,这就是为什么 String 程序在 java 采访中被用来访问编码技能的原因。

Java 中的 String 程序

在这里,我提供一些字符串程序在Java,以帮助你刷新你的编码技能. 请尝试自己解决这些问题,在检查答案以更好地学习之前. 我正在尝试使用Java中引入的所有最新功能,如 [Stream]( / 社区 / 教程 /java-8 流), [lambda表达式]( / 社区 / 教程 /java-lambda-expression), [功能界面]( / 社区 / 教程 /java-8 功能界面)等。

如何在一个字符串中获得不同的字符及其计数?

 1package com.journaldev.java.string;
 2
 3import java.util.HashMap;
 4import java.util.List;
 5import java.util.Map;
 6import java.util.stream.Collectors;
 7
 8public class DistinctCharsCount {
 9
10    public static void main(String[] args) {
11
12    	printDistinctCharsWithCount("abc");
13    	printDistinctCharsWithCount("abcab3");
14    	printDistinctCharsWithCount("hi there, i am pankaj");
15    }
16
17    private static void printDistinctCharsWithCount(String input) {
18    	Map<Character, Integer> charsWithCountMap = new HashMap<>();
19
20    	// using Map merge method from Java 8
21    	for (char c : input.toCharArray())
22    		charsWithCountMap.merge(c, 1, Integer::sum);
23    	System.out.println(charsWithCountMap);
24
25    	// another way using latest Java enhancements and no for loop, a bit complex though
26    	List<Character> list = input.chars().mapToObj(c -> (char) c).collect(Collectors.toList());
27
28    	list.stream().forEach(c -> charsWithCountMap.merge(c, 1, Integer::sum));
29
30    	System.out.println(charsWithCountMap);
31
32    }
33
34}

写一个Java程序来扭转一个字符串?

有很多方法可以扭转一个 String. 一些常见的方法是:

  • StringBuilder/StringBuffer reverse() 方法
  • 使用 char/byte 数组并向相反方向穿越并填充结果字符串

但是,如果您不确定输入 String 内容,请始终使用 StringBuilder 内置的 reverse() 方法. 因为使用 char 和 byte 数组可能会产生不必要的结果. 我在 Java 中的 Reverse a String中为此提供了完整的解释。

 1package com.journaldev.java.string;
 2
 3public class ReverseAString {
 4
 5    public static void main(String[] args) {
 6
 7    	reverseInputString("abc");
 8    	reverseInputString("ç©∆˙¨˚ø"); //special chars
 9    }
10
11    private static void reverseInputString(String input) {
12    	StringBuilder sb = new StringBuilder(input);
13    	String result = sb.reverse().toString();
14    	System.out.println(result);
15    }
16
17}

如何检查一个字符串是否是巴林德罗?

一个 palindrome 字符串是其反面也是相同的字符串的字符串,所以我们可以逆转输入字符串并检查这两个字符串是否相等,或者我们可以聪明地使用 String charAt(int index) 方法来检查 palindrome 字符串。

 1package com.journaldev.java.string;
 2
 3public class PalindromeString {
 4
 5    public static void main(String[] args) {
 6    	
 7    	checkPalindromeString("abc");
 8    	checkPalindromeString("abcba");
 9    	checkPalindromeString("ç∂©∂ç");
10    }
11
12    private static void checkPalindromeString(String input) {
13    	boolean result = true;
14    	int length = input.length();
15    	for(int i=0; i < length/2; i++) {
16    		if(input.charAt(i) != input.charAt(length-i-1)) {
17    			result = false;
18    			break;
19    		}
20    	}
21    	System.out.println(input + " is palindrome = "+result);
22    	
23    }
24
25}

如何从输入字符串中删除特定字符的所有发生?

在 String 类中没有删除函数,但我们可以在这种情况下使用replaceAll()

 1package com.journaldev.java.string;
 2
 3public class RemoveCharFromString {
 4
 5    public static void main(String[] args) {
 6
 7    	removeCharFromString("abcbcdjfkd", 'c');
 8    	removeCharFromString("Pankaj", 'a');
 9    	removeCharFromString("ç∂©∂ç", '©');
10
11    }
12
13    private static void removeCharFromString(String input, char c) {
14    	String result = input.replaceAll(String.valueOf(c), "");
15    	System.out.println(result);
16    }
17
18}

如何证明 String 在程序上是不可变的?

我們知道 String is immutable in java,但新的開發人員仍然會對此感到困惑。

1String s1 = "Java";
2
3s1 = "Python";

在上面的代码片段中,我们可以说 s1 值已经改变了,它是一个 String 对象,所以我们如何说 String 是不可变的?理解的最重要点是如何在 Java 中创建 Strings。当我们使用字母字符串创建 String 时,它不会改变原始 String 的值。它在字符串池中创建一个新的 String 并改变变量的参考。所以原始字符串值从未改变,这就是为什么 Strings 是不可变的。

 1package com.journaldev.java.string;
 2
 3public class StringImmutabilityTest {
 4
 5    public static void main(String[] args) {
 6
 7    	String s1 = "Java"; // "Java" String created in pool and reference assigned to s1
 8    	
 9    	String s2 = s1; //s2 is also having the same reference to "Java" in the pool
10    	
11    	System.out.println(s1 == s2); // proof that s1 and s2 have same reference
12    	
13    	s1 = "Python"; 
14    	//s1 value got changed above, so how String is immutable?
15    	
16    	//well, in above case a new String "Python" got created in the pool
17    	//s1 is now referring to the new String in the pool 
18    	//BUT, the original String "Java" is still unchanged and remains in the pool
19    	//s2 is still referring to the original String "Java" in the pool
20    	
21    	// proof that s1 and s2 have different reference
22    	System.out.println(s1 == s2); 
23    	
24    	System.out.println(s2); 
25    	// prints "Java" supporting the fact that original String value is unchanged, hence String is immutable
26    	
27    }
28
29}

写一个程序来计算一个字符串中的单词数量?

这个程序的简单解决方案似乎是input.split(" ").length,但如果你的字符串没有正确格式化,它包含引导和追踪空间,重复多个空间和卡。

 1package com.journaldev.java.string;
 2
 3public class CountNumberOfWordsInString {
 4
 5    public static void main(String[] args) {
 6    	
 7    	countNumberOfWords("My name is Pankaj");
 8    	countNumberOfWords("I Love Java Programming");
 9    	countNumberOfWords(" This	is not properly formatted		line ");
10
11    }
12
13    private static void countNumberOfWords(String line) {
14    	//System.out.println(line.split(" ").length); //won't work with tabs and multiple spaces
15    	
16    	String trimmedLine = line.trim();
17    	int count = trimmedLine.isEmpty() ? 0 : trimmedLine.split("\\s+").length;
18    	
19    	System.out.println(count);
20    }
21
22}

写一个程序来检查是否有两个具有相同字符的字符串?

首先,我们必须从输入字符串中创建一个字符集,然后使用 Set equals() 方法来检查它们是否包含相同的字符。

 1package com.journaldev.java.string;
 2
 3import java.util.Set;
 4import java.util.stream.Collectors;
 5
 6public class CheckSameCharsInString {
 7
 8    public static void main(String[] args) {
 9    	sameCharsStrings("abc", "cba");
10    	sameCharsStrings("aabbcc", "abc");
11    	sameCharsStrings("abcd", "abc");
12    	sameCharsStrings("11", "1122");
13    	sameCharsStrings("1122", "11");	
14    }
15
16    private static void sameCharsStrings(String s1, String s2) {
17
18    	Set<Character> set1 = s1.chars().mapToObj(c -> (char) c).collect(Collectors.toSet());
19    	Set<Character> set2 = s2.chars().mapToObj(c -> (char) c).collect(Collectors.toSet());
20    	System.out.println(set1.equals(set2));
21    }
22
23}

阅读两个字符串用户输入并检查第一个是否包含第二个字符串?

这是一个简单的程序,我们可以使用 String contains() 方法来检查指定的字符串是否是这个字符串的一部分,但是我们必须使用 Scanner class来读取用户输入。

 1package com.journaldev.java.string;
 2
 3import java.util.Scanner;
 4
 5public class StringContainsSubstring {
 6
 7    public static void main(String[] args) {
 8    	Scanner scanner = new Scanner(System.in);
 9    	System.out.println("Enter First String:");
10    	String s1 = scanner.nextLine();
11    	
12    	System.out.println("Enter Second String:");
13    	String s2 = scanner.nextLine();
14    	
15    	scanner.close();
16    	
17    	boolean result = stringContainsSubstring(s1, s2);
18    	System.out.println(s1+" contains "+s2+" = "+result);
19    }
20
21    private static boolean stringContainsSubstring(String string, String substring) {
22    	boolean result = false;
23    	result = string.contains(substring);
24    	return result;
25    }
26
27}

以下是上面的程序的样本输出:

1Enter First String:
2Pankaj
3Enter Second String:
4an
5Pankaj contains an = true

如何交换两个字符串而不使用第三个变量?

我们可以使用 String substring() 方法做到这一点,这里有一个简单的代码片段来展示这一点:

1String s1 = "abc";
2String s2 = "def";
3
4s1 = s1.concat(s2);
5s2 = s1.substring(0,s1.length()-s2.length());
6s1 = s1.substring(s2.length());

如果我们必须写一个函数来做这件事? 由于 String 是不可变的,方法中的 String 引用值的变化将在方法结束后消失。 此外,我们不能在 java 中从一种方法返回多个对象,所以我们将不得不创建一个容器来保持输入字符串,然后在方法中执行上述逻辑。

 1package com.journaldev.java.string;
 2
 3import java.util.Scanner;
 4
 5public class SwapTwoStrings {
 6
 7    public static void main(String[] args) {
 8    	
 9    	Container container = new Container();
10    	Scanner scanner = new Scanner(System.in);
11    	System.out.println("Enter First String:");
12    	container.setFirstString(scanner.nextLine());
13    	
14    	System.out.println("Enter Second String:");
15    	container.setSecondString(scanner.nextLine());
16    	scanner.close();
17    	System.out.println(container);
18    	container = swapStrings(container);
19    	System.out.println(container);
20    }
21
22    private static Container swapStrings(Container container) {
23    	container.setFirstString(container.getFirstString().concat(container.getSecondString())); //s1 = s1+s2
24    	container.setSecondString(container.getFirstString().substring(0, container.getFirstString().length()-container.getSecondString().length())); // s2=s1
25    	container.setFirstString(container.getFirstString().substring(container.getSecondString().length()));
26    	return container;
27    }
28
29}
30
31class Container{
32    private String firstString;
33    private String secondString;
34    
35    public String getFirstString() {
36    	return firstString;
37    }
38    public void setFirstString(String firstString) {
39    	this.firstString = firstString;
40    }
41    public String getSecondString() {
42    	return secondString;
43    }
44    public void setSecondString(String secondString) {
45    	this.secondString = secondString;
46    }
47    
48    @Override
49    public String toString() {
50    	return "First String = "+firstString+", Second String = "+secondString;
51    }
52}

样品产量:

1Enter First String:
2Java
3Enter Second String:
4Python
5First String = Java, Second String = Python
6First String = Python, Second String = Java

写一个程序,从输入字符串中找出第一个不重复的字符?

 1package com.journaldev.java.string;
 2
 3import java.util.ArrayList;
 4import java.util.List;
 5
 6public class FindNonRepeatingChar {
 7
 8    public static void main(String[] args) {
 9
10    	System.out.println(printFirstNonRepeatingChar("abcaabcdedxy"));
11    	System.out.println(printFirstNonRepeatingChar("abca"));
12    	System.out.println(printFirstNonRepeatingChar("aaa"));
13
14    }
15
16    private static Character printFirstNonRepeatingChar(String string) {
17    	char[] chars = string.toCharArray();
18
19    	List<Character> discardedChars = new ArrayList<>();
20
21    	for (int i = 0; i < chars.length; i++) {
22    		char c = chars[i];
23
24    		if (discardedChars.contains(c))
25    			continue;
26
27    		for (int j = i + 1; j < chars.length; j++) {
28    			if (c == chars[j]) { // match found
29    				discardedChars.add(c);
30    				break;
31    			} else if (j == chars.length - 1) { // no match found till end
32    				return c;
33    			}
34    		}
35    	}
36    	return null;
37    }
38
39}

提供两种方式来检查一个字符串是否只包含数字?

我们可以使用常规表达式来检查一个字符串是否是数字的,另一种方法是将它解析为长,如果它是一个非数字的字符串,那么它会扔NumberFormatException

 1package com.journaldev.java.string;
 2
 3public class CheckIfStringContainsDigitsOnly {
 4
 5    public static void main(String[] args) {
 6    	digitsOnlyString("111");
 7    	digitsOnlyString("111a 1");
 8    	digitsOnlyString("111 222");
 9    	digitsOnlyString("111L");
10
11    }
12
13    private static void digitsOnlyString(String string) {
14    	if(string.matches("\\d+")) System.out.println("Digit Only String ::"+string);
15    	
16    	try {
17    		long l = Long.parseLong(string);
18    		System.out.println("Digit Only String ::"+string);
19    	}catch(Exception e){
20    		System.out.println("Non Digit Only String ::"+string);
21    	}
22    	
23    }
24
25}

如何执行 Deep Copy for String?

字符串是不可变的,所以我们不必担心深层复制或浅层复制,我们可以简单地使用分配运算符 (=)来复制一个字符串到另一个字符串。

你可以从我的 GitHub 存储库下载示例。

Published At
Categories with 技术
Tagged with
comments powered by Disqus