1

Тема: Кількість унікальних слів у файлі

Доброго дня, я новачок в Java, є таке завдання: "Написати програму, що зчитує інформацію з текстового файлу і рахує кількість слів в файлі, кількість унікальних слів в файлі, виводить інформацію про кількість слів, кількість унікальних слів, унікальні слова за алфавітом і поруч скільки разів це слово зустрілося."

Використовувати ArrayList, HashMap і тд. не можна. Чи не могли б ви підказати як мені почати писати цей код і в якому напрямку рухатися? Буду дуже вдячний.

2

Re: Кількість унікальних слів у файлі

Більше схоже на то що ви член новмодного руху "войтивайти" і це якесь тестове завдання.
Почати варто з читання книжки

Подякували: 0xDADA11C71

3

Re: Кількість унікальних слів у файлі

1) В АйТі я вже давно. Але не в програмуванні, а в тестуванні. І це - "войтивайти" - було недоречно.
2) Це не частина ніякого тестового завдання.
3) Дякую за ваш відклил, хоч він і не дуже інформативний.

Подякували: 0x9111A1

4

Re: Кількість унікальних слів у файлі

Можна спробувати щось примітивніше (напр., масив, відсортований методом бульбашок чи прямої вставки, або бінарне дерево, реалізоване саморобними класами. У варіанті з деревом, його вузли можна доповнити лічильниками повторів — якщо додається слово, що вже є в дереві, не додавати слово повторно, а просто збільшувати лічильник).

Подякували: InvaderZim1

5

Re: Кількість унікальних слів у файлі

О, про бінарне дерево цікаво, якось навіть не подумав. Треба буде спробувати, дякую. Але саме зараз я і намагаюся це зробити через масиви. Але якось не дуже розумію як в масиві перевірити одинакові слова. Чи може спочатку пустити каунтер на всі слова, а потім їх записувати в масив? І при наступних записах перевіряти чи є таке слово в масиві і записувати його якщо немає?
Про книжку теж дякую, теорію читав, але теорія без практики це не дуже хороше, і не дуже зрозуміло.
Дякую всім за підказки.

6

Re: Кількість унікальних слів у файлі

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.regex.Pattern;


public class IOText2 {
 public static void main(String args[]) throws FileNotFoundException {

  Pattern p = Pattern.compile("[^(\\w')(\\w-)]"); //важливо правильно визначити regexp


  Scanner scan = new Scanner(new FileReader(
    "Тут//шлях//до//файлу")).useDelimiter(p);
  Set<String> words = new HashSet<String>(); // дає значення, що не повторюються

  while (scan.hasNext()) {
   String s = scan.next();
   s = s.trim();
   if (!s.isEmpty())
    words.add(s.toLowerCase());
  }
  System.out.println(words.size()); // виведе кількість унікальних слів в тексті

  scan.close();
 }
}

7

Re: Кількість унікальних слів у файлі

Untested:

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Stream;

import static java.lang.System.out;
import static java.util.Arrays.stream;
import static java.util.function.Function.identity;
import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;

public class CountSorted {

    private static final Path INPUT_FILE_PATH = Paths.get("text.txt");

    public static void main(String[] args) throws Exception {
        try (Stream<String> lines = Files.lines(INPUT_FILE_PATH)) {
            Map<String, Long> wordCount =
                lines.flatMap(line -> stream(line.split("\\W+"))).sorted()
                     .collect(groupingBy(identity(), counting()));

            // Print word repetitions
            wordCount.forEach((word, count) -> {
                out.println(String.format("The word '%s' occurs '%s' times in text", word, count));
            });

            // Print unique words and count them
            out.print("Unique words: ");
            AtomicInteger totalUniqueWordsAmount = new AtomicInteger(0);
            wordCount.forEach((word, count) -> {
                if (count == 1L) {
                    out.print(word + " ");
                    totalUniqueWordsAmount.getAndIncrement();
                }
            });
            out.println(String.format("(%s) in total", totalUniqueWordsAmount.get()));
            
            // Print total words in text
            Long totalWords = wordCount.values().stream().reduce(0L, Long::sum);
            out.println("Total words in text = " + totalWords);
        }
    }
}