powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Подробный разбор строки
22 сообщений из 22, страница 1 из 1
Подробный разбор строки
    #38667008
beginner123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, уважаемые господа программисты!

Подскажите, пожалуйста, как можно разобрать строку по следующим условиям:
1) найти самое длинное слово в строке;
2) найти наиболее часто повторяющееся слово;
3) вывести частоту (как часто встречается) каждого слова в строке.
Нельзя пользоваться split`ом, trim`ом, списками (хоть я от безысходности и воспользовался, что неправильно), коллекциями, нежелательно создавать дополнительные string`и, а использовать циклы (как можно меньше), массивы (хоть сколь угодно мерные).

В общем, я сделал так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
public static void main(String[] args) {
	String s = " \n  Какой-нибудь  текст, \t для примера. Или для примеров?.. "
			+ "Все-таки для примера.  \n  Или даже какой-нибудь пример! ";
	
	ArrayList<String> list = new ArrayList<String>();
	int i = 0, j = 0;
	for(; j < s.length(); j++) {
		if(s.charAt(j) == ' ' || s.charAt(j) == '\n' || s.charAt(j) == '\t') {
			if(j > i) {
				list.add(s.substring(i, j));
			}
			i = j + 1;
		}
	}
	if(i < s.length()) {
		list.add(s.substring(i));
	}
	String[] r = list.toArray(new String[list.size()]);
	
	int k = 0, k2 = 0;
	for (; k < r.length; k++) {
		if(k2 < r[k].length()) k2 = r[k].length();
	}
	// Print
	System.out.println("Всего слов в строке: " + r.length);
	System.out.println("Самое длинное слово: \"" + r[k2] + "\"\n------");		
}


так у меня и не получилось поместить разобранные слова напрямую в массив, воспользовался списком, но это неверно. Затем нашел самое длинное слово, но как дальше что-то не получается...
...
Рейтинг: 0 / 0
Подробный разбор строки
    #38667025
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beginner123,


автор1) найти самое длинное слово в строке;
3) вывести частоту (как часто встречается) каждого слова в строке.
сделать Map<String, Integer> String -слово, Integer - сколько раз встретилось

делаем буфер StringBuilder...
и делаем String maxWord;

1.читаем символ пока не кончится строка
2.если символ (не пробел, не таб, не \n) - буфер.append(символ), goto 1.
3.если буфер не пустой //слово закончилось
3.1 если map.contains(буфер.toString()) - map.set(буфер.toString(), map.get(буфер.toString())+1)
3.2 если нет, то просто map.set(буфер.toString(), 1)
3.3 maxWord=(буфер.toString().lenght > maxWord.lenght)?буфер.toString():maxWord;
3.4 буфер.setLength(0) goto 1
4.goto 1 //ничего не делаем это "пробел после пробела".

автор2) найти наиболее часто повторяющееся слово;
найти ключ с макс значением
...
Рейтинг: 0 / 0
Подробный разбор строки
    #38668193
beginner123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
no56892 , благодарю вас за алгоритм, но Map<String, Integer>, к сожалению, не подходит...
...
Рейтинг: 0 / 0
Подробный разбор строки
    #38668201
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beginner123,
Код: html
1.
2.
3.
примера
пример
примеров


Это одно слово в разных падежах? Или три слова?
...
Рейтинг: 0 / 0
Подробный разбор строки
    #38668202
beginner123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonЭто одно слово в разных падежах? Или три слова?
по задумке - это три разных слова
...
Рейтинг: 0 / 0
Подробный разбор строки
    #38668207
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beginner123maytonЭто одно слово в разных падежах? Или три слова?
по задумке - это три разных слова
Скушная задумка. Неинтересно...
...
Рейтинг: 0 / 0
Подробный разбор строки
    #38668222
beginner123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonСкушная задумка. Неинтересно...
значит, для вас это "семечки"?
...
Рейтинг: 0 / 0
Подробный разбор строки
    #38668250
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beginner123,
Ну замените на 2 массива:
String[] str и
int[] num

где num[x] - кол-во повторений str[x]
...
Рейтинг: 0 / 0
Подробный разбор строки
    #38668307
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beginner123maytonСкушная задумка. Неинтересно...
значит, для вас это "семечки"?
Подсчёт слов? Это решённая тыщу раз задача. Ее можно нагуглить в готовом виде.
Зачем форум?
...
Рейтинг: 0 / 0
Подробный разбор строки
    #38668688
beginner123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
no56892 , спасибо вам! Попробую именно так и сделать.

maytonЗачем форум?
действительно, зачем?.. Может, для баянов?
...
Рейтинг: 0 / 0
Подробный разбор строки
    #38670075
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Развлёкся)

TextAnalyze.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
package textanalyze;

import java.util.ArrayList;
import lombok.experimental.ExtensionMethod;

import static java.lang.System.out;
import static textanalyze.util.StringExtractor.extractChars;

@ExtensionMethod(Character.class)
public class TextAnalyze {

    private static final String SRC =
            " \n  Какой- нибудь нибудь  нибудь  текст, \t для примера. Или для примеров?.. " +
            "Все-таки для примера-примеры.  \n  Или даже какой-нибудь пример-примеР";

    public static void main(String[] a) {

        StringBuilder sb = new StringBuilder(100);
        LineAnalyzer lineAnalyzer = new LineAnalyzer();
        FullTextAnalyzer fullTextAnalyzer = new FullTextAnalyzer();

        for (char ch : extractChars(SRC)) {
            if (ch.isLetterOrDigit()) {
                sb.append(ch.toLowerCase());
            } else {
                if (sb.length() > 0) {
                    String word = sb.toString();
                    lineAnalyzer.put(word);
                    fullTextAnalyzer.put(word);
                    sb.setLength(0);
                }
                if (ch == '\n') {
                    lineAnalyzer.printInfo();
                    lineAnalyzer.clear();
                }
            }
        }

        if (sb.length() > 0) {
            String word = sb.toString();
            lineAnalyzer.put(word);
            fullTextAnalyzer.put(word);

            lineAnalyzer.printInfo();
        } else if (lineAnalyzer.maxLength() > 0) {
            lineAnalyzer.printInfo();
        }


        ArrayList<String> mostRepeatableWords = fullTextAnalyzer.mostRepeatableWords();

        if (mostRepeatableWords.isEmpty()) {
            out.println("Повторяющихся слов нет");
        } else {
            if (mostRepeatableWords.size() == 1) {
                out.print("Наиболее часто повторяющееся слово: ");
                out.println(mostRepeatableWords.get(0));
            } else {
                out.print("Наиболее часто повторяющееся слова: ");
                out.println(mostRepeatableWords);
            }
            out.print("Повторено: ");
            out.println(fullTextAnalyzer.maxRepeated());
        }
    }
}

Analyzer.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
package textanalyze;

import java.util.ArrayList;
import java.util.HashMap;

public abstract class Analyzer {

    protected int max;

    /** На случай если нужных слов будет несколько. */
    protected final ArrayList<String> neededWords = new ArrayList<>(1);

    protected final HashMap<String, Count> countsWords = new HashMap<>();

    /** @param word передаётся сюда в нижнем регистре */
    public abstract void put(String word);
}

FullTextAnalyzer.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
package textanalyze;

import java.util.ArrayList;

public class FullTextAnalyzer extends Analyzer {

    public FullTextAnalyzer() {
        max = 1;
    }

    /** @param word передаётся сюда в нижнем регистре */
    @Override public void put(String word) {
        Count count = countsWords.get(word);
        if (count != null) {
            count.value++;

            if (count.value > max) {
                neededWords.clear();
                neededWords.add(word);
                max = count.value;
            } else if (count.value == max) {
                neededWords.add(word);
            }

        } else {
            countsWords.put(word, new Count());
        }
    }

    public ArrayList<String> mostRepeatableWords() {
        return neededWords;
    }

    public int maxRepeated() {
        return max;
    }
}

LineAnalyzer.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
package textanalyze;

import static java.lang.System.out;

public class LineAnalyzer extends Analyzer {

    /** @param word передаётся сюда в нижнем регистре */
    @Override public void put(String word) {
        int length = word.length();

        if (length > max) {
            neededWords.clear();
            neededWords.add(word);
            max = length;

            countsWords.put(word, new Count());
            return;
        }

        if (length == max && !neededWords.contains(word)) {
            neededWords.add(word);
        }

        Count count = countsWords.get(word);
        if (count != null) {
            count.value++;
        } else {
            countsWords.put(word, new Count());
        }
    }

    public int maxLength() {
        return max;
    }

    //<editor-fold defaultstate="collapsed" desc="reuseCount">
    private int reuseCount;

    public int reuseCount() {
        return reuseCount;
    }
    //</editor-fold>

    public void clear() {
        neededWords.clear();
        countsWords.clear();
        max = 0;
        reuseCount++;
    }

    public void printInfo() {
        out.print("Строка # ");
        out.println(reuseCount);

        if (neededWords.isEmpty()) {
            out.println("Слов нет.");
        } else {
            if (neededWords.size() == 1) {
                out.print("Самое длинное слово: ");
                out.println(neededWords.get(0));
            } else {
                out.print("Самые длинные словa: ");
                out.println(neededWords);
            }

            out.print("Повторения: ");
            out.println(countsWords);
            out.println("------------------------------------------------");
        }
    }
}

Count.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
package textanalyze;

public class Count {

    public int value = 1;

    @Override public String toString() {
        return Integer.toString(value);
    }
}


Extractor.java
Код: java
1.
2.
3.
4.
5.
6.
package textanalyze.util;

public interface Extractor<F, T> {

    T extract(F from);
}

StringExtractor.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
package textanalyze.util;

import java.lang.reflect.Field;

public class StringExtractor {

    private StringExtractor() {}

    private static Extractor<String, char[]> extractor = new Extractor<String, char[]>() {
        @Override public char[] extract(String from) {
            try {
                Field field = String.class.getDeclaredField("value");
                field.setAccessible(true);
                char[] result = (char[]) field.get(from);

                extractor = new NormalExtractor(field);

                return result;
            } catch (Throwable any) {
                //<editor-fold defaultstate="collapsed" desc="dummyCopier">
                DummyCopier dummyCopier = new DummyCopier();
                extractor = dummyCopier;
                return dummyCopier.extract(from);
                //</editor-fold>
            }
        }
    };

    private static class NormalExtractor implements Extractor<String, char[]> {

        private final Field field;
        public NormalExtractor(Field field) {
            this.field = field;
        }

        @Override public char[] extract(String from) {
            try {
                return (char[]) field.get(from);
            } catch (IllegalArgumentException | IllegalAccessException reallyDoubltWhatThisWillBeThrown) {
                //<editor-fold defaultstate="collapsed" desc="dummyCopier">
                DummyCopier dummyCopier = new DummyCopier();
                extractor = dummyCopier;
                return dummyCopier.extract(from);
                //</editor-fold>
            }
        }
    }

    private static class DummyCopier implements Extractor<String, char[]> {
        @Override public char[] extract(String from) {
            return from.toCharArray();
        }
    }

    /**
     * ОСТОРОЖНО! Может привести к изменению строки (по контракту immutable объекта).
     * Возможно есть ссылки на экземпляр этой строки, там где мы не предпологали.
     */
    @Deprecated
    public static char[] extractChars(String text) {
        return extractor.extract(text);
    }
}

...
Рейтинг: 0 / 0
Подробный разбор строки
    #38670299
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Навеяло.

Как не надо писать разбор строки факториал.

http://habrahabr.ru/post/113128/
...
Рейтинг: 0 / 0
Подробный разбор строки
    #38670452
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, Analyzer#put можно убрать.
...
Рейтинг: 0 / 0
Подробный разбор строки
    #38670471
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mk , автор пишет

Нельзя пользоваться split`ом, trim`ом, списками (хоть я от безысходности и воспользовался, что неправильно), коллекциями
...
Рейтинг: 0 / 0
Подробный разбор строки
    #38670500
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beginner123,

авторПодскажите, пожалуйста, как можно разобрать строку по следующим условиям:
1) найти самое длинное слово в строке;
2) найти наиболее часто повторяющееся слово;
3) вывести частоту (как часто встречается) каждого слова в строке.
Нельзя пользоваться split`ом, trim`ом, списками (хоть я от безысходности и воспользовался, что неправильно), коллекциями, нежелательно создавать дополнительные string`и, а использовать циклы (как можно меньше), массивы (хоть сколь угодно мерные).


Это лаба?

откуда такие условия???
...
Рейтинг: 0 / 0
Подробный разбор строки
    #38670504
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Это лаба? откуда такие условия???
Да, кэп, это лаба или другое аналогичное задание.
...
Рейтинг: 0 / 0
Подробный разбор строки
    #38670506
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напомнило.

В студенчестве мы на сях делали лабу. Так препод заставлял
реализовывать весь набор строковых функций типа strlen, strcat, ... e.t.c.
...
Рейтинг: 0 / 0
Подробный разбор строки
    #38670517
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton avp.mk , автор пишет
Читал. =)
Потому и есть класс Analyzer, где можно взять и реализовать по-другому функционал, который сейчас реализуется ArrayList'ом и HashMap'ом..
...
Рейтинг: 0 / 0
Подробный разбор строки
    #38670542
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mkmayton avp.mk , автор пишет
Читал. =)
Потому и есть класс Analyzer, где можно взять и реализовать по-другому функционал, который сейчас реализуется ArrayList'ом и HashMap'ом..
Прояви фантазию. Инкапсулировать Лист и Хештейбл может любой.

Допустим дисковая операция - дешёвая (SSD накопитель) а оперативка
ограничена (устройство в 1Килобайт JVM кода).

Можно ли всё таки реализовать задачу beginner-а без коллекций. Думаю можно.

Пройдись по файлу много раз...
...
Рейтинг: 0 / 0
Подробный разбор строки
    #38670591
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автору в помощь http://algs4.cs.princeton.edu/code/

Книга и решения задач из нее!
...
Рейтинг: 0 / 0
Подробный разбор строки
    #38672268
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonПрояви фантазию.
Не не не. Я и так слишком дофига фантазии уже проявил.

maytonПройдись по файлу много раз...
И разрушить исходный файл\(строку), верно?
...
Рейтинг: 0 / 0
Подробный разбор строки
    #38672452
beginner123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
avp.mkразвлекся)
Ого! И правда! Спасибо! Очень познавательно!
Atum1Это лаба?
Это еще не лаба, так, заданьице.
maytonТак препод заставлял реализовывать весь набор строковых функций типа strlen, strcat, ... e.t.c.
Вот-вот! Аналогичный изврат. Мол, он консерватор, выросший на первых версиях и считает, что с выходом новых версий что-нибудь да поменяется и наш код работать не будет, поэтому только хардкор!
Atum1Автору в помощь http://algs4.cs.princeton.edu/code/
Книга и решения задач из нее!
Спасибо! Уже "курю" по-тиху.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Подробный разбор строки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]