String Programma’s in Java

String is de meest gebruikte klasse in de Java-programmering. Daarom worden String-programma’s gebruikt in Java-interviews om de programmeervaardigheden te beoordelen.

String-programma’s in Java

Hier geef ik enkele string-programma’s in Java om u te helpen bij het opfrissen van uw programmeervaardigheden. Probeer deze vragen zelf op te lossen voordat u de antwoorden controleert om op een betere manier te leren. Ik probeer alle nieuwste functionaliteiten te gebruiken die zijn geïntroduceerd in Java, zoals Stream, lambda-uitdrukkingen, functionele interfaces etc.

Hoe krijg je afzonderlijke karakters en hun telling in een String?

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<>();

		// gebruikmakend van de Map merge-methode van Java 8
		for (char c : input.toCharArray())
			charsWithCountMap.merge(c, 1, Integer::sum);
		System.out.println(charsWithCountMap);

		// een andere manier om de nieuwste Java-verbeteringen te gebruiken en geen for-lus, wel wat complexer
		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);

	}

}

Schrijf een java programma om een String om te keren?

Er zijn veel manieren om een String om te keren. Enkele van de gebruikelijke manieren zijn:

  • StringBuilder/StringBuffer reverse() methode
  • Het gebruiken van een char/byte array en het traverseren in omgekeerde richting en het vullen van de resulterende string

Echter, als je niet zeker bent van de inhoud van de invoerstring, gebruik altijd de ingebouwde reverse() methode van StringBuilder. Omdat het gebruiken van char en byte array ongewenste resultaten kan opleveren. Ik heb hier een volledige uitleg voor gegeven in String omkeren in 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);
	}

}

Hoe controleer je of een String een palindroom is?

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);
		
	}

}

Hoe verwijder je alle voorkomens van een gegeven karakter uit een invoer String?

Er is geen verwijderfunctie in de String-klasse, maar we kunnen in dit geval replaceAll() gebruiken. Hier is het eenvoudige programma dat laat zien hoe het moet.

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);
	}

}

Hoe kun je programmatisch bewijzen dat String onveranderlijk is?

We weten dat String onveranderlijk is in Java, maar nieuwe ontwikkelaars raken hier nog steeds in de war. Laten we proberen de reden voor deze verwarring te begrijpen.

String s1 = "Java";

s1 = "Python"; 

In bovenstaand codefragment kunnen we zeggen dat de waarde van s1 is veranderd en het is een String-object. Dus hoe kunnen we zeggen dat String onveranderlijk is? Het belangrijkste punt om te begrijpen is hoe Strings in Java worden gemaakt. Wanneer we een String maken met een string-literal, verandert het de waarde van de oorspronkelijke String niet. Het maakt een nieuwe String in de string pool en wijzigt de referentie van de variabele. Dus de oorspronkelijke stringwaarde wordt nooit gewijzigd en daarom zijn Strings onveranderlijk. Het onderstaande programma bewijst onze verklaring, lees de opmerkingen voor een goed begrip van het concept.

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-waarde is hierboven gewijzigd, dus waarom is String onveranderlijk? 
		
		//welnu, in het bovenstaande geval werd een nieuwe String "Python" aangemaakt in de pool
		//s1 verwijst nu naar de nieuwe String in de pool 
		//MAAR, de oorspronkelijke String "Java" is nog steeds onveranderd en blijft in de pool
		//s2 verwijst nog steeds naar de oorspronkelijke String "Java" in de pool
		
		// bewijs dat s1 en s2 verschillende verwijzingen hebben
		System.out.println(s1 == s2); 
		
		System.out.println(s2); 
		// geeft "Java" weer, wat aantoont dat de oorspronkelijke String-waarde ongewijzigd is, vandaar dat String onveranderlijk is
		
	}

}

Schrijf een programma om het aantal woorden in een String te tellen?

De eenvoudige oplossing voor dit programma lijkt input.split(" ").length, maar dit werkt niet als je string niet correct is opgemaakt en leidende en volgende spaties, dubbele spaties en tabs bevat. Gelukkig neemt de String split()-functie reguliere expressie als argument en kunnen we het gebruiken om het aantal woorden in een string te tellen.

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); //werkt niet met tabs en meerdere spaties
		
		String trimmedLine = line.trim();
		int count = trimmedLine.isEmpty() ? 0 : trimmedLine.split("\\s+").length;
		
		System.out.println(count);
	}

}

Schrijf een programma om te controleren of twee strings zijn gemaakt met dezelfde tekens?

Ten eerste moeten we een set van tekens maken vanuit de invoerstrings. Gebruik vervolgens de methode Set equals() om te controleren of ze dezelfde tekens bevatten of niet. Hier is een eenvoudig programma om te controleren of twee strings zijn gemaakt met dezelfde tekens.

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));
	}

}

Lees twee stringinvoer van de gebruiker en controleer of de eerste de tweede bevat?

Dit is een eenvoudig programma en we kunnen de methode contains() van String gebruiken om te controleren of de opgegeven string deel uitmaakt van deze string. We moeten echter de Scanner-klasse gebruiken om gebruikersinvoer te lezen.

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;
	}

}

Hier is een voorbeeldoutput van bovenstaand programma:

Enter First String:
Pankaj
Enter Second String:
an
Pankaj contains an = true

Hoe twee strings te verwisselen zonder een derde variabele te gebruiken?

We kunnen dit doen met de `substring()`-methode van String. Hier is een eenvoudig stukje code om dit te illustreren:

String s1 = "abc";
String s2 = "def";

s1 = s1.concat(s2);
s2 = s1.substring(0,s1.length()-s2.length());
s1 = s1.substring(s2.length());

Wat als we een functie moeten schrijven om dit te doen? Aangezien String onveranderlijk is, zullen de wijzigingen in de waarden van de String-referenties in de methode verdwijnen zodra de methode eindigt. Ook kunnen we geen meerdere objecten retourneren vanuit een methode in Java. Dus moeten we een Container maken om de invoerstrings vast te houden en vervolgens de bovenstaande logica in de methode uitvoeren. Onderstaande code laat zien hoe dit kan worden gedaan, hoewel het er ingewikkeld uitziet, is de logica hetzelfde als hierboven.

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;
	}
}

Voorbeelduitvoer:

Enter First String:
Java
Enter Second String:
Python
First String = Java, Second String = Python
First String = Python, Second String = Java

Schrijf een programma om het eerste niet-herhaalde karakter uit de invoerstring te vinden?

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;
	}

}

Geef twee manieren om te controleren of een string alleen cijfers bevat?

We kunnen reguliere expressies gebruiken om te controleren of een string numeriek is of niet. Een andere manier is om het naar een Long te parsen, en als het een niet-numerieke string is, zal het een `NumberFormatException` veroorzaken.

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);
		}
		
	}

}

Hoe voer je een diepe kopie uit voor een tekenreeks?

Een tekenreeks is onveranderlijk, dus we hoeven ons geen zorgen te maken over diepe kopie of ondiepe kopie. We kunnen eenvoudig de toekenningsoperator (=) gebruiken om een tekenreeks naar een andere tekenreeks te kopiëren. Lees meer details op Java String copy.

Je kunt de voorbeelden downloaden van mijn GitHub Repository.

Source:
https://www.digitalocean.com/community/tutorials/string-programs-in-java