Есть ли в Java способ проверить условие:
"Есть ли вообще этот символ в строке x"
без использования цикла?
Вы можете использовать string.indexOf('a')
.
Если
'a'
присутствует вstring
, то возвращается индекс (>=0). Если нет, возвращается -1. Таким образом, неотрицательное возвращаемое значение означает, что'a' присутствует в строке
.
String.contains()
, который проверяет, содержит ли строка указанную последовательность значений charString.indexOf()
, который возвращает индекс в строке первого появления указанного символа или подстроки (существует 4 вариации этого метода)Я не уверен, что именно спрашивает оригинальный постер. С indexOf (...) и содержит (...) оба вероятно используют петли внутри, возможно, он ищет, возможно ли это вообще без цикла? Я могу думать о двух путях от руки, один, конечно, будет рекурсия:
public boolean containsChar(String s, char search) {
if (s.length() == 0)
return false;
else
return s.charAt(0) == search || containsChar(s.substring(1), search);
}
Другой гораздо менее элегантный, но полнота...:
/**
* Works for strings of up to 5 characters
*/
public boolean containsChar(String s, char search) {
if (s.length() > 5) throw IllegalArgumentException();
try {
if (s.charAt(0) == search) return true;
if (s.charAt(1) == search) return true;
if (s.charAt(2) == search) return true;
if (s.charAt(3) == search) return true;
if (s.charAt(4) == search) return true;
} catch (IndexOutOfBoundsException e) {
// this should never happen...
return false;
}
return false;
}
Количество линий растет, так как вам нужно поддерживать более длинные и длинные строки, конечно. Но нет никаких петель / повторов вообще. Вы даже можете удалить проверку длины, если вы обеспокоены тем, что эта длина () использует цикл.
Вы можете использовать 2 метода из класса String
.
String.contains ()
, который проверяет, содержит ли строка указанную последовательность значений символовString.indexOf ()
, который возвращает индекс в строке первого появления указанного символа или подстроки или возвращает -1, если символ не найден (существует 4 варианта этот метод)Метод 1:
String myString = "foobar";
if (myString.contains("x") {
// Do something.
}
Метод 2:
String myString = "foobar";
if (myString.indexOf("x") >= 0 {
// Do something.
}
Ссылки: Зак Скривена
Если вам нужно часто проверять одну и ту же строку, вы можете рассчитать вхождения символов заранее. Это реализация, которая использует битовый массив, содержащийся в длинном массиве:
public class FastCharacterInStringChecker implements Serializable {
private static final long serialVersionUID = 1L;
private final long[] l = new long[1024]; // 65536 / 64 = 1024
public FastCharacterInStringChecker(final String string) {
for (final char c: string.toCharArray()) {
final int index = c >> 6;
final int value = c - (index << 6);
l[index] |= 1L << value;
}
}
public boolean contains(final char c) {
final int index = c >> 6; // c / 64
final int value = c - (index << 6); // c - (index * 64)
return (l[index] & (1L << value)) != 0;
}}
Чтобы проверить, не существует ли чего-либо в строке, нужно, по крайней мере, просмотреть каждый символ в строке. Поэтому даже если вы не будете явно использовать цикл, он будет иметь ту же эффективность. Учитывая это, вы можете попробовать использовать str.contains(""+char).
package com;
public class _index {
public static void main(String[] args) {
String s1="be proud to be an indian";
char ch=s1.charAt(s1.indexOf('e'));
int count = 0;
for(int i=0;i<s1.length();i++) {
if(s1.charAt(i)=='e'){
System.out.println("number of E:=="+ch);
count++;
}
}
System.out.println("Total count of E:=="+count);
}
}
String s="praveen";
boolean p=s.contains("s");
if(p)
System.out.println("string contains the char 's'");
else
System.out.println("string does not contains the char 's'");
string does not contains the char 's'
static String removeOccurences(String a, String b)
{
StringBuilder s2 = new StringBuilder(a);
for(int i=0;i<b.length();i++){
char ch = b.charAt(i);
System.out.println(ch+" first index"+a.indexOf(ch));
int lastind = a.lastIndexOf(ch);
for(int k=new String(s2).indexOf(ch);k > 0;k=new String(s2).indexOf(ch)){
if(s2.charAt(k) == ch){
s2.deleteCharAt(k);
System.out.println("val of s2 : "+s2.toString());
}
}
}
System.out.println(s1.toString());
return (s1.toString());
}
you can use this code. It will check the char is present or not. If it is present then the return value is >= 0 otherwise it's -1. Here I am printing alphabets that is not present in the input.
import java.util.Scanner;
public class Test {
public static void letters()
{
System.out.println("Enter input char");
Scanner sc = new Scanner(System.in);
String input = sc.next();
System.out.println("Output : ");
for (char alphabet = 'A'; alphabet <= 'Z'; alphabet++) {
if(input.toUpperCase().indexOf(alphabet) < 0)
System.out.print(alphabet + " ");
}
}
public static void main(String[] args) {
letters();
}
}
//Ouput Example
Enter input char
nandu
Output :
B C E F G H I J K L M O P Q R S T V W X Y Z
Вы не сможете проверить, появляется ли char вообще в какой-либо строке, не пройдя хотя бы одну строку один раз с помощью цикла / рекурсии (встроенные методы, такие как indexOf, также используют цикл)
Если нет. раз, когда вы смотрите вверх, если символ находится в строке x , это больше, чем длина строки, чем я бы порекомендовал использовать [Set](https://docs.oracle.com/javase/7/docs/ апи / java / util / Set.html) структура данных, так как это было бы более эффективно, чем просто использование indexOf
String s = "abc" ;
// Создайте набор, чтобы мы могли проверить, существует ли символ в постоянное время O (1)
Set < Character > set = new HashSet < > () ;
int len = s.length ();
for (int i = 0; i < len; i ++) set.add (s.charAt (i)) ;
// Теперь мы можем проверить без необходимости цикла
// содержит метод set, который не использует цикл, в отличие от метода string's hesclude
set.contains ('a') // true
set.contains ('z') // false
Используя набор, вы сможете проверить, существует ли символ в строке в постоянном времени O (1), но вы также будете использовать дополнительную память (сложность пространства будет O (n)).
Для этого я использовал метод string.includes (), который возвращает true или false, если найдена строка или символ. Смотрите ниже документацию.
// это только главное... Вы можете использовать буферный считыватель или сканер
string s;
int l=s.length();
int f=0;
for(int i=0;i<l;i++)
{
char ch1=s.charAt(i);
for(int j=0;j<l;j++)
{
char ch2=charAt(j);
if(ch1==ch2)
{
f=f+1;
s.replace(ch2,'');
}
f=0;
}
}
//if replacing with null does not work then make it space by using ' ' and add a if condition on top.. checking if its space if not then only perform the inner loop...