سلسلة هي الفئة الأكثر استخدامًا في برمجة جافا. لهذا السبب يتم استخدام برامج السلاسل في مقابلات جافا للوصول إلى مهارات البرمجة.
برامج السلاسل في جافا
هنا أقدم لك بعض برامج السلاسل في جافا لمساعدتك في تحسين مهارات البرمجة الخاصة بك. يرجى محاولة حل هذه الأسئلة بنفسك قبل التحقق من الإجابات لتعلم بطريقة أفضل. أحاول استخدام جميع الوظائف الأحدث المقدمة في جافا ، مثل التدفق ، تعبيرات لامبدا ، الواجهات الوظيفية ، إلخ.
كيفية الحصول على الأحرف المميزة وعددها في سلسلة؟
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<>();
// باستخدام طريقة الدمج في Map من جافا 8
for (char c : input.toCharArray())
charsWithCountMap.merge(c, 1, Integer::sum);
System.out.println(charsWithCountMap);
// طريقة أخرى باستخدام تحسينات جافا الأحدث وبدون حلقة 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);
}
}
كيفية إزالة جميع حالات الحرف المعطى من سلسلة النصوص المدخلة؟
لا توجد وظيفة إزالة في فئة السلسلة، ولكن يمكننا استخدام 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 s1 = "Java";
s1 = "Python";
في المقطع البرمجي أعلاه، يمكننا القول بأن قيمة s1 تغيرت وأنها كائن سلسلة. فكيف يمكننا القول بأن السلسلة لا تتغير؟ النقطة الأكثر أهمية لفهمها هي كيفية إنشاء السلاسل في جافا. عند إنشاء سلسلة باستخدام النص الأساسي، فإنه لا يتغير قيمة السلسلة الأصلية. بل ينشئ سلسلة جديدة في حمام السلاسل ويغير مرجع المتغير. لذلك فإن قيمة السلسلة الأصلية لا تتغير أبدًا ولهذا السبب تكون السلاسل غير قابلة للتغيير. يثبت البرنامج أدناه بياننا، اقرأ التعليقات لفهم المفهوم بشكل صحيح.
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 أعلاه، فكيف يكون السلسلة غير قابلة للتغيير؟
//حسنًا، في الحالة أعلاه تم إنشاء سلسلة جديدة "Python" في المجموعة
//s1 تشير الآن إلى السلسلة الجديدة في المجموعة
//لكن السلسلة الأصلية "Java" لا تزال دون تغيير وتظل في المجموعة
//s2 تشير لا تزال إلى السلسلة الأصلية "Java" في المجموعة
//دليل على أن s1 و s2 لديهما مراجع مختلفة
System.out.println(s1 == s2);
System.out.println(s2);
//يطبع "Java" داعمًا لحقيقة أن قيمة السلسلة الأصلية لم تتغير، وبالتالي السلسلة غير قابلة للتغيير
}
}
اكتب برنامجًا لحساب عدد الكلمات في سلسلة؟
الحل البسيط لهذا البرنامج يبدو أنه 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));
}
}
اقرأ إدخال مستخدمين اثنين وتحقق مما إذا كانت السلسلة الأولى تحتوي على الثانية؟
هذا برنامج بسيط ويمكننا استخدام طريقة 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
كيفية تبديل سلسلتين دون استخدام متغير ثالث؟
يمكننا القيام بذلك باستخدام طريقة substring()
في السلسلة. فيما يلي مقتطف كود بسيط لعرض هذا:
String s1 = "abc";
String s2 = "def";
s1 = s1.concat(s2);
s2 = s1.substring(0,s1.length()-s2.length());
s1 = s1.substring(s2.length());
ماذا لو كان علينا كتابة دالة للقيام بذلك؟ نظرًا لأن السلسلة لا تتغير، فإن التغيير في قيم مراجع السلسلة في الطريقة سيختفي بمجرد انتهاء الطريقة. كما أنه لا يمكننا إرجاع عدة كائنات من طريقة في جافا. لذلك سنضطر إلى إنشاء حاوية لاحتواء السلاسل المدخلة ثم تنفيذ المنطق أعلاه في الطريقة. يوضح الكود أدناه كيف يمكن القيام بذلك، على الرغم من أنه قد يبدو معقدًا ولكن المنطق هو نفسه كما هو موضح أعلاه.
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);
}
}
}
كيفية أداء النسخ العميق للسلسلة؟
السلسلة ليست قابلة للتغيير، لذا لا داعي للقلق بشأن النسخ العميق أو النسخ السطحي. يمكننا ببساطة استخدام عامل النسبة (=) لنسخ سلسلة واحدة إلى أخرى. اقرأ المزيد من التفاصيل في نسخ سلسلة جافا.
يمكنك تحميل الأمثلة من مستودع الجيتهاب الخاص بي.
Source:
https://www.digitalocean.com/community/tutorials/string-programs-in-java