last day (15 days later) » 

11:41 AM
1
A: Проблема в реализации объекта

Александр ПоташевМогу и написать: interface SentensePart {} class Word implements SentensePart {...} class Punctuation implements SentensePart {...} class Sentence { //private Word[] words; //private Punctuation[] punctuations; //вместо этих двух строк с массивами классов используем один массив с общим инт...

 
1.Так гласит задание. 2.Не дописал, так как сначала хотел проверить на работоспособность.
А как нам заполнять массив? Чтобы все в правильном порядке заполнялось
 
Можно парсить текст посимвольно
 
в моем коде Слово может быть со знаком пунктуации, а мне нужно, чтобы они отдельно были (например туда, - это слово) и как мы можем парсить, если у нас массив объектов?
 
Так и в чем сложность: прочитали символ, если не пробел и не знак пунктуации, то добавляем к текущему слову. Если пробел - значит слово закончилось, и добавляем его к массиву sentensePart. Если знак препинания, то добавляем сперва слово, потом знак препинания.
 
Задаем цикл по длине Предложения, а как нам символы прибавлять к слову?
 
11:41 AM
Например так: обнаружили первую букву - начало слова, создали пустой массив букв и добавили туда букву; прочитали следующую - добавили в массив; нашли конец слова - создали объект Word из этого массива.
 
Добавил функцию добавления в конце моего вопроса.Почему выдает исключение ArrayIndexOutOfBoundsException?
 
добавил комментарии в ответ. Кроме описанных, есть ошибки в логике метода, например, при нахождении знака пунктуации, слово не создается.
 
а почему это sentenceParts[i] = wordToAdd; неправильно? разве по другому мы можем в массив добавить?
 
У Вас получится очень разреженный массив. Мама мыла раму. - элементов 4. Получится в sentenceParts слова Мама будет на 3 месте, мыла - на 8, раму на 12, а точка на 13. Остальные элементы будут null. Оно вам надо?
Вообще метод добавление слова или знака препинания правильнее размещать в классе Sentense.
 
Так метод у меня и есть в классе Sentence
создать еще один цикл, еще один массив, куда закидывать новосозданные обьекты , а потом элементы с этого массива закинуть в SentencePart?
 
11:51 AM
Чувствую вы меня скоро запутаете. Зачем вам вообще sentenseParts в этом методе?
Могу порекомендовать посмореть какое-нибудь видео по декомпозиции объектов.
Например, вот неплохое: https://www.youtube.com/watch?v=xOx-si8s3K8
 
Вот этот метод размещен в классе Sentence, этот метод добавляет объекты Слово и Пунктуация в массив sentenseParts, который размещен в этом же классе.Разве не так?
 
Тут у вас для каждого значения j начинается перебор i с начала
 
уже знаю
 
12:06 PM
Не обратил внимания, что это в классе Sentence.
Вот такую "рыбу" набросал, если интересно
char[] chars = text.toCharArray();
StringBuilder sb = null;
for (Character c : chars) {
if (isLetter(c)) {
if (sb == null) {
sb = new StringBuilder();
}
sb.append(c);
} else {
if (sb != null) {
Word word = new Word(sb.toString().toCharArray());
//метод добавления к sentensePart
sb = null;
}
if (isPunktuation(c)) {
Puncktuation puncktuation = new Punktuation(c);
//метод добавления к sentensePart
}
}
}

Не проверял правда.
 
 
1 hour later…
1:28 PM
Вроде сделал через коллекцию. Еще один вопрос: поскольку я разделяю предложения через split(), я теряю знак пунктуации в конце предложения. Как добавить?
 
1:40 PM
Потому что "разделитель" при операции split удаляется из результатов.
"asdf,ghjk".split(",") - будет "asdf" и "ghjk"
Можно попробовать ч/з regex-ы, если знакомы
Можно так же посимвольно перебирать как в разбиении предложения на слова и знаки.
 
1:54 PM
через regex-ы это возможно?
мы используем regex-ы через метод split()
 
Через регэекспы возможно очень многое, но если не работали будет не очень просто. Под регекспами я имею в виду классы Pattern и Matcher.
 
2:41 PM
как через pattern и matcher заменить " ," , " ." , " !" , " ?" на ',' , '.' , '!' , '?' соответсвенно?
 
Документацию надо смотреть, я помню плохо. А чем в этом случае не подходит replaceAll?
Про Pattern писал в контексте замены им метода split
 
3:00 PM
просто поработать) ну да ладно)
result.replaceAll("\\s,", ",");
result.replaceAll("\\s\\.", "\\.");
почему оно не меняет?
 
result = result.replaceAll(...).replaceAll(...)....;
строки вообще неизменяемые объекты (immutable)
 
точно
при изменении создается новый объект
спасибо!
доделал задание
 

last day (15 days later) »