seqSearchFunction (String s, char c) - PullRequest
       16

seqSearchFunction (String s, char c)

4 голосов
/ 01 апреля 2019

Я пытаюсь создать две функции.Первый: это показывает 'true', если переменная c появляется по крайней мере ОДИН РАЗ в переменной String.Два: та же функция, но показывает положение буквы.Более конкретно, функция seqSearchPos (String s, char c) ищет, если c появляется в s.функция возвращает позицию c в s, если она существует.Если c не существует, функция вернет -1.

К сожалению, я не знаю, как решить эту проблему, эту конкретную проблему, касающуюся String и char. Должен быть метод, который я до сих пор не знаю, который можетпомогите мне в этом вопросе

public static boolean seqSearch(String s, char c) {
       boolean found=false;
       if(s.equals(c)) {
           found=true;
       }
       return found;
   }

Main:

String s="e";
char c='e';
System.out.println(seqSearch(s,c));

public static int seqSearchPos(String s,char c) {
       int position=-1;
       for(int i=0; i<s.length(); i++) {
           if(s.equals(c)) {
               position=i;
               break;
           }
       }
       return position;
   }

Main:

String s="hello";
char c='e';
System.out.println(seqSearchPos(s,c));

Я ожидалчтобы показать истину в первом и во втором положении 1, но он показал ложь и -1 соответственно.

Ответы [ 4 ]

2 голосов
/ 01 апреля 2019

В этой строке кода есть ошибка:

if(s.equals(c)) {

Она сравнивает всю строку с символом, и она (очевидно) не совпадает.

Вам необходимосравните один символ по индексу в строке:

if (s.charAt(i) == c) {

В качестве отступления вы также можете использовать return непосредственно из оператора if.Это позволит вам удалить переменную position и сделать код немного короче:

public static int seqSearchPos(String s, char c) {
    for (int i = 0; i < s.length(); i++) {
        if (s.charAt(i) == c) {
            return i;
        }
    }
    return -1;
}

Существует также метод String.indexOf (int c) , который делает именно то, что вынужно и позволит вам написать метод следующим образом:

public static int seqSearchPos(String s, char c) {
    return s.indexOf(c);
}

Или, что еще лучше, просто вызовите этот метод String напрямую, а не оборачивайте его в своей собственной функции.

1 голос
/ 01 апреля 2019

На самом деле вы пытаетесь реализовать contains(char) и indexOf(char) методы класса String.

Вы сравниваете всю строку с одним символом. Если длина строки не равна 1, ваш метод всегда будет возвращать false. Чтобы исправить это, вы должны выполнить итерацию каждого символа String. И вы можете сравнить два символа с оператором ==.

public static boolean seqSearch(String s, char c) {
   boolean found=false;
   for(int i=0;i<s.length();i++){
     if(s.charAt(i)==c) {
        found=true;
     }
   }
   return found;

}

Та же проблема существует во втором выпуске, вы должны сравнить каждый символ.

public static int seqSearchPos(String s,char c) {
   int position=-1;
   for(int i=0; i<s.length(); i++) {
       if(s.charAt(i)==c) {
           position=i;
           break;
       }
   }
   return position;

}

1 голос
/ 01 апреля 2019

Вы должны быть в состоянии найти свои ответы здесь: Как я могу проверить, появляется ли один символ в строке?

В одном из ответов также говорится о положении персонажа.

В основном они используют библиотеку String по умолчанию, а именно: String.contains() и String.indexOf()

.
0 голосов
/ 01 апреля 2019

Как уже отмечали другие, ваша проблема в том, что вы сравниваете всю строку s с символом c, который всегда ложен.

Вот две реализации ваших методов, использующих потоки Java:

public static boolean seqSearch(String string, char character) {
    return string.chars().anyMatch(c -> c == character);
}

Это создает IntStream, содержащий все символы, возвращающие true, если любой из них равен true.

public static int seqSearchPos(String string, char character) {
    return IntStream.range(0, string.length())
            .filter(i -> string.charAt(i) == character)
            .findFirst()
            .orElse(-1);
}

Здесь вы создаете IntStream от 0 до n - 1 и возвращаете первый индекс, если символ найден.Если нет, возвращается -1.

Помимо всего этого вы можете просто использовать собственный метод String.indexOf(), который делает именно то, что вы хотите:

public static int seqSearchPos(String string, char character) {
    return string.indexOf(character);
}

Вы также можете использовать этот метод для вашего seqSearch() метода:

public static boolean seqSearch(String string, char character) {
    return string.indexOf(character) >= 0;
}

В качестве альтернативы вы можете использовать собственный метод String.contains() для достижения этого:

public static boolean seqSearch(String string, char character) {
    return string.contains(String.valueOf(character));
}
...