Рубрики
Без рубрики

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

Строковые программы на Java, Строковые программы Java для собеседования, Примеры простых строк код для практики собеседования, Вопросы и ответы по программированию на строковые интервью, Строковые программы Java, Пример простых строковых программ

Автор оригинала: Pankaj Kumar.

Строка является наиболее широко используемым классом в программировании на Java. Вот почему строковые программы используются в интервью на 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 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 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 обратный() метод
  • Используя массив символов/байтов, пройдите в обратном направлении и заполните результирующую строку

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

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 нет функции remove, но в этом случае мы можем использовать 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);
	}

}

Как доказать, что строка неизменна программно?

Мы знаем , что строка неизменна в java, однако новые разработчики все еще путаются с этим.

Давайте попробуем понять причину этой путаницы.

String s1 = "Java";

s1 = "Python"; 

В приведенном выше фрагменте кода мы можем сказать, что значение s1 изменилось, и это строковый объект. Итак, как мы можем сказать, что строка неизменна?

Самый важный момент, который нужно понять, – это то, как создаются строки в 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 set1 = s1.chars().mapToObj(c -> (char) c).collect(Collectors.toSet());
		Set set2 = s2.chars().mapToObj(c -> (char) c).collect(Collectors.toSet());
		System.out.println(set1.equals(set2));
	}

}

Прочитайте два строковых ввода пользователя и проверьте, содержит ли первый второй?

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

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

Что, если для этого нам придется написать функцию? Поскольку строка неизменяема, изменение значений ссылок на строки в методе исчезнет, как только метод закончится. Кроме того, мы не можем возвращать несколько объектов из метода в 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 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 .