2017-02-11 13 views
0

Итак, целью является поиск шаблонов, таких как «zip» и «zap» в строке, начиная с «z» и заканчивая «p». Затем для всех таких строк удалите среднюю букву.Как поместить несколько частей строки в список?

Что я имел в виду, так это то, что я использую цикл for для проверки каждой буквы строки, и как только она достигает «z», она получает indexOf ('p') и помещает это и все в середине в ArrayList, удаляя себя из исходной строки, чтобы можно было найти indexOf ('p').

Проблема в том, что я не могу найти способ сделать это, поскольку я довольно новичок в Java. Если кто-нибудь может помочь мне бы благодарен :)

это мой код до сих пор

package Homework; 

import java.util.Scanner; 
import java.util.ArrayList; 
import java.util.List; 

public class ZipZap { 

public static void main(String[] args) { 
    Scanner in = new Scanner(System.in); 
    List<String> list = new ArrayList<String>(); 

    System.out.print("Write a sentence with no spaces:"); 
    String sen = in.next(); 
    int len = sen.length(); 
    int p1 = sen.indexOf('p'); 
    String word = null; 
    String idk = null; 

    for(int i=0; i<len; i++){ 
     if(sen.charAt(i)=='z'){ 
      word = sen.substring(i, p1+1); 
      list.add(word); 
      idk = sen.replace(word,""); 
      i=0; 
     } 
    } 
} 

}

+0

Возможно, посмотрите на 'String # split', чтобы разделить' String' на массив слов – MadProgrammer

+0

, а что с помощью String.split, чтобы найти все «z» (http://stackoverflow.com/questions/2206378/как к сплит-а-строка-но-и-держать-на-разделители). то для каждого слова в списке замените все буквы со второй позиции до первой «p» –

+0

. Этот код не будет выполнен, если перед буквой «z» произойдет «p». I.e., он не работает для «xxpxxzxxpxx». Он также терпит неудачу для «xxzxxpxxz». Это потому, что вы только вызываете sen.indexOf ('p') один раз. Вы должны вызвать его после того, как найдете «z», и вы должны использовать версию indexOf(), которая принимает два аргумента, чтобы вы могли указать позицию «z» в качестве начальной позиции для поиска. –

ответ

1

использование этого здесь я использую «\ bz.p \ Ъ» шаблон для поиска любого слова, которое содержит начальный символ с г и концом с р-либо может быть между

String s ="Write a sentence with no zip and zap spaces:"; 
s=s.replaceAll("\\bz.p\\b", "zp"); 
System.out.println(s); 

выходом:

Write a sentence with no zp and zp spaces: 

или это может быть

s.replaceAll("z\\w+p", "zp"); 

здесь вы можете проверить вас строка

https://regex101.com/r/aKaNTJ/2

+0

Прохладная ссылка. ***** –

+0

спасибо @NickZiebert –

+0

ooh, что очень помогает! спасибо :) –

0

Я думаю, что вы говорите, что ввод zipzapityzoop, например, должен быть изменен до zpzpityzp с i, a и oo в list. Пожалуйста, исправьте меня, если я неправильно понял ваше намерение.

Вы находитесь в пути и, кажется, понимаете основы. Вопросы, которые я вижу незначительны, но, конечно, вы хотите, чтобы исправить их:

  • Как отмечает @RicharsSchwartz, чтобы найти все строки, как zip, zap и zoop, вам нужно найти p после каждого z вы найдете. Когда вы нашли z по индексу i, вы можете использовать sen.indexOf('p', i + 1), чтобы найти p после z (второй аргумент заставляет поиск начинать с этого индекса).
  • Каждый раз, когда вы нашли z, вы устанавливаете i обратно в 0, начиная с начала строки. Не нужно это делать, и таким образом ваша программа никогда не остановится.
  • sen.substring(i, p1+1) достает все zip, когда я понял, что вы только хотели i. Вам необходимо настроить аргументы на substring().
  • Ваше использование sen.replace(word, "") заменит все случаи использования word.Поэтому, как только вы исправите свою программу, чтобы вынуть a от zap, zappa станет zpp (не zppa), а azap будет zp. Нет простого способа удалить только одно конкретное появление подстроки из String. Я думаю, что решение состоит в том, чтобы использовать класс StringBuilder. Он имеет метод delete, который удаляет часть между двумя указанными индексами, что вам нужно (er, это домашнее задание, в котором вы не должны использовать класс, который вы не изучили в классе?)
  • Наконец, вы назначаете измененную строку другой переменной idk, но затем продолжаете искать sen. Это похоже на присвоение zpzapityzoop, zipzpityzoop и zipzapityzp - idk в свою очередь, но никогда zpzpityzp. Однако, если вы используете StringBuilder, как я только что предложил, просто используйте то же самое StringBuilder, и все будет хорошо.

Надеюсь, вам это удастся.

+0

ohhhh! omg вы спасатель жизни. Спасибо большое! –