2016-10-20 2 views
-1

Это мое задание. Мне не разрешено использовать заявления if.вычисляет количество строк в другой строке

написать программу NumStrings.java, который принимает две строки через командную строку как
входа, а затем выводит число раз вторая строка встречается в качестве подстроки в первым.

Мой плохой код:

public class Test { 


    public static void main(String[] args) { 
     String a = "HelloHelloHelloHello"; 
     String b = "Hello"; 
     int times = 0; 
     for(int i=0; i <= a.length()-5; i++){ 
      for (int z=4; z<=(a.length()-1) && a.compareTo(b)==0; z++){ 
       times = times +1; 
      } 
     } 
     System.out.print(times); 
    } 
} 
+0

У вашего кода много проблем. Кроме того, вы не выполняете задание. Если это необходимо для получения аргументов командной строки, вы должны использовать массив 'args'. –

+0

Я знаю, но я хочу сначала проверить его с помощью более простого кода –

+0

Когда 'a =" ZZZ "и' b = "ZZ" ', он должен вернуть 1 или 2? – saka1029

ответ

1

Вот правильный способ сделать это, используя subString() (документация здесь: https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#substring(int)):

String a = "HelloHelloHelloHello"; 
String b = "Hello"; 
int times = 0; 
for (int i = 0; i <= a.length() - b.length(); i++) { 
    String substring = a.subString(i, i + b.length()); 
    if (substring.equals(b)) { 
     times = times + 1; 
    } 
} 
System.out.println(times); 

А вот способ сделать это без if заявления ... Которые я не рекомендую. Но если вам нужно это сделать, это сработает.

String a = "HelloHelloHelloHello"; 
String b = "Hello"; 
int times = 0; 
for (int i = 0; i <= a.length() - b.length(); i++) { 
    String substring = a.substring(i, i + b.length()); 
    for (int j = 0; substring.equals(b) && j < 1; j++) { 
     times = times + 1; 
    } 
} 
System.out.println(times); 
+0

У меня возникли проблемы с другим вопросом, мне нужно отредактировать строку, но мы все еще не узнали, что в классе все же у меня получилось через 5 часов; $ –

+0

@MohammadAlBaba Вы должны задать новый вопрос для этого. Это зависит от того, как и когда вам нужно изменить его и где должен быть сохранен результат. – nhouser9

+0

@MohammadAlBaba Но также, я уверен, что если вы будете искать вопросы, которые уже были заданы, вы найдете тех, кто уже задал такой вопрос. – nhouser9

1

Посмотрите на это следующим образом: вы не должны рассчитывать, как часто вы находите второй строку в первой строки, потому что вы всегда должны проверить если вы нашли его или нет , Таким образом, чтобы избежать всех видов условий или операторов, рассмотрите возможность использования firstString.split(secondString).

split(someString) вернет вам массив оставшихся подстроки, как только вы «сплит» базовая строка каждый раз, когда он находит свою подстроку:

String first = "bababa"; 
String second = "a"; 
String[] substrings = first.split(second); 

Теперь substrings будет выглядеть следующим образом: ["b", "b", b"], потому что каждый a был удалены, а остальные помещены в отдельные строки.

Далее вы должны проверить размер массива, и вы увидите, как часто ваша ячейка first была разделена.

int count = substrings.length; // 3 

Однако, это не конец, потому что мы все еще имеем следующий случай:

String first = "bababaa"; 

С выше решения вы получите массив размером 3: ["b", "b", "b"]. Последнее вхождение a будет только удалено, не оставляя подстроки позади (даже не пустой '').

Таким образом, вы можете воспользоваться другим (немного отличается) split():

first.split(second, limit); 

limit Где максимальное число вхождений метод пытается найти. Итак, как часто вы можете найти свою вторую строку в первой? Как много писем первая строка имеет: int limit = first.length

first.split(second, first.length); // will produce [b, b, b, , ] 

Можете ли вы увидеть, что происходит? в конце есть две пустые строки, где есть два a.Вы получаете массив подстрок для всего, что находится до или после появление второй строки.

Естественно, когда вы разделите строку ba, вы получите ["b", ], поэтому 2 подстроки. Но вы не заботитесь о b только «запятыми» посередине (за каждые a a ,).

first.split(second, first.length).length -1; // that's how many commas there are, and thats how many second strings there are 

EDIT
(спасибо @ saka1029!) Таким образом, метод "раскол" по-прежнему пропускает кое-что, когда first="aaa" и second="aa", потому что он считает только 1 не 2 вхождений.
Чтобы исправить это, я подумал о том, чтобы перебрать всю первую строку и проверить только на первое вхождение, а затем удалить первую букву и продолжить (, так как OP уже принял другой ответ, я просто отправлю свой код):

String first = "ZZZ"; 
    String second = "ZZ"; 
    int counter = 0;   // counts the number of occurrences 
    int n = first.length(); // needs to be fixed, because we'll change the length of the first string in the loop 
    for(int i = 0; i < n; i++){ // check the first string letter by letter 
     String[] split = first.split(second, 2); // we want one substring and the rest (2 in total) like: ['', 'Z'] when we cut off the first 'ZZ' 
     counter += split.length - 1; // now add the number of occurrences (which will be either 0 or 1 in our case) 
     first = first.substring(1); // cut off the first letter of the first string and continue 
    } 
    System.out.println("counter = " + counter); // now we should get 3 for 'ZZZ' 
+0

Он возвращает 1 вместо 2 для 'first =" ZZZ "и' second = "ZZ" '. – saka1029

+0

ой! Не могу поверить, что я пропустил это. – GameDroids

+0

@ saka1029: Я знаю, что для этого уже слишком поздно, но что вы думаете об этом? Вы можете найти другую проблему? – GameDroids

Смежные вопросы