Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Подробный разбор строки / 22 сообщений из 22, страница 1 из 1
11.06.2014, 00:49
    #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
11.06.2014, 01:35
    #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
11.06.2014, 22:57
    #38668193
beginner123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подробный разбор строки
no56892 , благодарю вас за алгоритм, но Map<String, Integer>, к сожалению, не подходит...
...
Рейтинг: 0 / 0
11.06.2014, 23:17
    #38668201
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подробный разбор строки
beginner123,
Код: html
1.
2.
3.
примера
пример
примеров


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

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

maytonЗачем форум?
действительно, зачем?.. Может, для баянов?
...
Рейтинг: 0 / 0
16.06.2014, 10:36
    #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
16.06.2014, 13:08
    #38670299
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подробный разбор строки
Навеяло.

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

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

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

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


Это лаба?

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

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

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

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

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

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

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


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