Поиск по сайту:

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


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

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

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

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

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

	}

}

Написать Java-программу для реверсирования строки?

Есть много способов обратить строку. Вот некоторые из распространенных:

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

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

}

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

Строка-палиндром — это та, обратная сторона которой также является той же строкой. Таким образом, мы можем перевернуть входную строку и проверить, равны ли обе строки для этого. Или мы можем проявить смекалку и использовать метод String charAt(int index) для проверки строки палиндрома.

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 неизменяем в 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 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
		
	}

}

Написать программу для подсчета количества слов в строке?

Кажется, что простым решением для этой программы является input.split( ).length, но это не сработает, если ваша строка неправильно отформатирована и содержит начальные и конечные пробелы, дублирует несколько пробелов и вкладки. К счастью, в качестве аргумента используется регулярное выражение, и мы можем использовать его для подсчета количества слов в строке.

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

}

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

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

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

}

Как выполнить Deep Copy для строки?

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

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