Строковые программы на Java

Строка – это самый широко используемый класс в программировании на Java. Именно поэтому программы со строками используются на собеседованиях по Java для проверки навыков кодирования.

Программы со строками на Java

Вот несколько программ со строками на Java, которые могут помочь вам освежить ваши навыки кодирования. Попробуйте решить эти вопросы сами, прежде чем проверить ответы, чтобы учиться более эффективно. Я пытаюсь использовать все последние функции, введенные в Java, такие как Stream, лямбда-выражения, функциональные интерфейсы и так далее.

Как получить уникальные символы и их количество в строке?

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 из Java 8
		for (char c : input.toCharArray())
			charsWithCountMap.merge(c, 1, Integer::sum);
		System.out.println(charsWithCountMap);

		// другой способ с использованием последних улучшений Java и без цикла 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 для разворота строки?

Существует множество способов развернуть строку. Некоторые из распространенных вариантов:

  • Метод reverse() классов StringBuilder/StringBuffer
  • Использование массива char/byte и обход в обратном направлении для заполнения результирующей строки

Однако, если вы не уверены в содержимом входной строки, всегда используйте встроенный метод reverse() класса StringBuilder. Поскольку использование массива 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);
		
	}

}

Как удалить все вхождения заданного символа из входной строки?

В классе String нет функции удаления, но в этом случае мы можем использовать 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 является неизменным?

Мы знаем, что String неизменен в Java, однако новым разработчикам по-прежнему бывает сложно это понять. Давайте попробуем понять причину этого недопонимания.

String s1 = "Java";

s1 = "Python"; 

В приведенном выше отрывке кода мы можем сказать, что значение s1 изменилось, и это объект String. Так как же мы можем утверждать, что String неизменен? Самый важный момент для понимания заключается в том, как создаются строки в Java. Когда мы создаем строку с использованием строкового литерала, это не изменяет значение исходной строки. Он создает новую строку в пуле строк и изменяет ссылку переменной. Таким образом, исходное значение строки никогда не изменяется, и вот почему строки неизменны. Ниже приведена программа, подтверждающая наше утверждение, внимательно прочитайте комментарии для правильного понимания концепции.

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, но это не будет работать, если ваша строка не отформатирована правильно и содержит ведущие и завершающие пробелы, повторяющиеся множественные пробелы и табуляции. К счастью, функция 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);
	}

}

Напишите программу для проверки, созданы ли две строки с одинаковыми символами?

Прежде всего, нам нужно создать набор символов из входных строк и затем использовать метод Set 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));
	}

}

Считайте две строки от пользователя и проверьте, содержит ли первая вторую?

Это простая программа, и мы можем использовать метод String 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

Как поменять местами две строки без использования третьей переменной?

Мы можем сделать это, используя метод 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+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);
		}
		
	}

}

Как выполнить глубокое копирование для строки?

Строка неизменяема, поэтому нам не нужно беспокоиться о глубоком или поверхностном копировании. Просто используйте оператор присваивания (=), чтобы скопировать одну строку в другую. Подробнее см. на Копирование строки в Java.

Вы можете скачать примеры с моего репозитория GitHub.

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