NỘI DUNG BÀI VIẾT
String là lớp được sử dụng rộng rãi nhất trong lập trình java. Đó là lý do tại sao các chương trình String được sử dụng trong các cuộc phỏng vấn Java để tiếp cận các kỹ năng viết code.
Chương trình String trong Java
Ở đây tôi cung cấp một số chương trình String trong Java để giúp bạn nâng cao kỹ năng viết code của mình. Hãy cố gắng tự giải quyết những câu hỏi này trước khi kiểm tra câu trả lời để học một cách tốt hơn.
Tôi đang cố gắng sử dụng tất cả các chức năng mới nhất được giới thiệu trong Java, chẳng hạn như Stream, lambda expressions, functional interfaces etc.
Làm thế nào để có được các ký tự riêng biệt và số lượng của chúng trong một 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);
}
}
Code language: PHP (php)
Viết chương trình java để đảo ngược một String?
Có nhiều cách để đảo ngược một String. Một số cái phổ biến là:
- StringBuilder/StringBuffer
reverse()
method - Sử dụng mảng char / byte và duyệt theo hướng ngược lại và điền vào chuỗi kết quả
Tuy nhiên, nếu bạn không chắc chắn về nội dung String đầu vào, hãy luôn sử dụng phương thức reverse() tích hợp sẵn trong StringBuilder. Bởi vì sử dụng mảng char và byte có thể tạo ra kết quả không mong muốn. Tôi đã cung cấp một lời giải thích đầy đủ cho điều này trong ReverseAString trong Java.
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);
}
}
Code language: JavaScript (javascript)
Làm thế nào để kiểm tra xem một chuỗi có phải là Palindrome không?
Một chuỗi palindrome là một chuỗi có ngược lại cũng là một chuỗi. Vì vậy, chúng ta có thể đảo ngược chuỗi đầu vào và kiểm tra xem cả hai chuỗi có bằng nhau hay không. Hoặc thông minh hơn và sử dụng phương thức String charAt(int index) để kiểm tra chuỗi palindrome.
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);
}
}
Code language: JavaScript (javascript)
Làm cách nào để xóa tất cả các lần xuất hiện của một ký tự nhất định khỏi Chuỗi đầu vào?
Không có hàm remove trong lớp String, nhưng chúng ta có thể sử dụng replaceAll() trong trường hợp này. Đây là chương trình đơn giản hướng dẫn cách thực hiện.
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);
}
}
Code language: JavaScript (javascript)
Làm thế nào để chứng minh String là bất biến theo chương trình?
Chúng tôi biết rằng String là bất biến trong java, tuy nhiên các developer mới vẫn còn lúng túng với điều này.
String s1 = "Java";
s1 = "Python";
Code language: JavaScript (javascript)
Trong đoạn mã trên, chúng ta có thể nói rằng giá trị s1 đã được thay đổi và nó là một đối tượng Chuỗi. Vậy làm thế nào chúng ta có thể nói rằng String là bất biến?
Điểm quan trọng nhất cần hiểu là cách Strings được tạo trong java. Khi chúng tôi tạo Chuỗi bằng cách sử dụng ký tự chuỗi, nó không thay đổi giá trị của Chuỗi ban đầu.
Nó tạo một Chuỗi mới trong nhóm chuỗi và thay đổi tham chiếu của biến. Vì vậy, giá trị chuỗi ban đầu không bao giờ bị thay đổi và đó là lý do tại sao các Chuỗi là bất biến.
Hãy xem ví dụ dưới đây:
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
}
}
Code language: JavaScript (javascript)
Viết chương trình đếm số từ trong một String?
Giải pháp đơn giản cho chương trình này dường như là input.split (“”) .length nhưng điều này sẽ không hiệu quả nếu chuỗi của bạn không được định dạng đúng và chứa các khoảng trắng ở đầu và cuối, sao chép nhiều khoảng trắng và tab.
May mắn thay, hàm split () lấy biểu thức chính quy làm đối số và chúng ta có thể sử dụng nó để đếm số từ trong một chuỗi.
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);
}
}
Code language: JavaScript (javascript)
Viết chương trình kiểm tra xem hai Chuỗi có được tạo bằng các ký tự giống nhau hay không?
Trước hết, chúng ta sẽ phải tạo một Bộ ký tự từ các String đầu vào. Sau đó, sử dụng phương thức Set equals() để kiểm tra xem chúng có chứa các ký tự giống nhau hay không. Đây là một chương trình đơn giản để kiểm tra xem hai chuỗi có được tạo bằng các ký tự giống nhau hay không.
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));
}
}
Code language: JavaScript (javascript)
Đầu vào 2 input của người dùng và kiểm tra xem đầu tiên có chứa thứ hai không?
Đây là một chương trình đơn giản và chúng ta có thể sử dụng phương thức String contains() để kiểm tra xem chuỗi được chỉ định có phải là một phần của chuỗi này hay không. Tuy nhiên, chúng ta sẽ phải sử dụng lớp Scanner để đọc đầu vào của người dùng.
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;
}
}
Code language: JavaScript (javascript)
Output:
Enter First String:
Pankaj
Enter Second String:
an
Pankaj contains an = true
Code language: JavaScript (javascript)
Làm thế nào để hoán đổi hai Chuỗi mà không sử dụng biến thứ ba?
Chúng ta có thể làm điều đó bằng cách sử dụng phương thức String substring(). Đây là một đoạn mã đơn giản để giới thiệu điều này:
String s1 = "abc";
String s2 = "def";
s1 = s1.concat(s2);
s2 = s1.substring(0,s1.length()-s2.length());
s1 = s1.substring(s2.length());
Code language: JavaScript (javascript)
Điều gì sẽ xảy ra nếu chúng ta phải viết một hàm để làm điều này? Vì String là bất biến, sự thay đổi giá trị của các tham chiếu String trong phương thức sẽ biến mất ngay sau khi phương thức kết thúc. Ngoài ra, chúng tôi không thể trả về nhiều đối tượng từ một phương thức trong java. Vì vậy, chúng ta sẽ phải tạo một Container để chứa các chuỗi đầu vào và sau đó thực hiện logic trên trong phương thức. Đoạn mã dưới đây cho thấy cách thực hiện điều này, mặc dù nó có thể trông phức tạp nhưng logic tương tự như trên.
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;
}
}
Code language: JavaScript (javascript)
Output:
Enter First String:
Java
Enter Second String:
Python
First String = Java, Second String = Python
First String = Python, Second String = Java
Code language: JavaScript (javascript)
Viết chương trình để tìm ra ký tự không lặp lại đầu tiên từ Chuỗi đầu vào?
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;
}
}
Code language: JavaScript (javascript)
Đưa ra hai cách để kiểm tra xem một Chuỗi chỉ chứa các chữ số hay không?
ublic 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);
}
}
}
Code language: JavaScript (javascript)
Làm thế nào để thực hiện Deep Copy cho String?
Chuỗi là bất biến, vì vậy chúng tôi không cần phải lo lắng về bản sao sâu hoặc bản sao cạn. Chúng ta có thể chỉ cần sử dụng toán tử gán (=) để sao chép một chuỗi này sang chuỗi khác.
Trên đây là các trường hợp về String, happy learning!!