Grupowanie i zliczanie słów

0

Cześć. Mój program (w Javie) wypluwa mi w forze poszczególne Stringi w postaci:

tekst1
tekst1
tekst1
tekst2
tekst3

Jaki kod mam zastosować, aby pogrupować te słowa i w dodatku dodać do nich licznik? Chciałbym, aby output był następujący:

3 tekst1
1 tekst2
1 tekst3

Pozdrawiam.

0
Dictionary<>
1

Skoro masz tam jakieś List<String> to zrób

Map<String, Long> mapa = stringList.stream().collect(Collectors.groupingBy(entry -> entry, Collectors.counting()));

i voila, masz mapę która dla każdego stringa zwraca ci ile razy wystąpił.

0

Kurczę, kombinuję z dołożeniem map, ale bezskutecznie. Dotąd najlepszym rezultatem było wypisanie stringów z licznikiem obok, który zawsze pokazywał 1. Poniżej kod, który dotychczas napisałem:

import java.io.File;
import java.util.Scanner;

public class Test {
static Scanner input = new Scanner(System.in);

public static void fileListing(File[] files, int depth) {
    if(depth == 0)
        return;
    else {
        for(File file: files) {
            if(file.isDirectory())
                fileListing(file.listFiles(), depth-1);
            else {
                String ext;
                String fileName = file.getName();
                if(fileName.lastIndexOf(".") != -1 && fileName.lastIndexOf(".") != 0)
                    ext = fileName.substring(fileName.lastIndexOf(".")+1);
                else
                    return;
                System.out.println(ext);
            }
        }
    }
}

public static void main(String [] args) {
    System.out.printf("Path: ");
    String path = input.nextLine();

    if(new File(path).isDirectory()) {
        System.out.printf("Depth: ");
        int depth = input.nextInt();
        File[] file = new File(path).listFiles();
        fileListing(file, depth);
    }
    else {
        System.out.printf("The path %s isn't valid.", path);
        System.exit(0);
    }
  }
}

Czy nie da się jakoś prościej dodać do tego licznika?

2

No dobra, ale teraz łaskawie napisz CO chciałeś osiągnąć, bo ten kod to spaghetti. Obstawiam że cały twój problem można stuknąć w 2 linijkach. Ok, mój wrodzony geniusz mówi że chcesz policzyć ile w danym drzewie jest plików o danych rozszerzaniach? OMG pogmatwałeś to tak ze hej...

        Map<String, Long> extensions = Files.walk(Paths.get("root"))
                .filter(path -> !Files.isDirectory(path))
                .map(Path::getFileName)
                .map(Object::toString)
                .filter(fileName -> fileName.contains("."))
                .map(fileName -> fileName.substring(fileName.lastIndexOf(".") + 1))
                .collect(Collectors.groupingBy(
                                extension -> extension,
                                Collectors.counting()
                        )
                );

uprzedzając: Files.walk() ma argument "maxDepth" jeśli ci to potrzebne.

0

Zgadza się. Na wejściu podaję katalog oraz głębokość przeszukiwania katalogu. Na wyjściu mam podane znalezione rozszerzenia plików, pogrupowane i z licznikiem wystąpień.

0

No to wyżej masz cały kod, z tą różnicą że musisz dodac sobie ten depth do Files.walk(Paths.get("root"), depth) a zamiast "root" podać nazwę zmiennej ze ścieżką do katalogu.

0

Dzięki. Tylko, że katalogi powinny być przeszukiwane rekurencyjnie.

0

I są. Czemu udajesz mądrale zamiast sprawdzić? o_O

0

Mówiąc szczerze, to myślałem, iż w dziale "Newbie" podejście do początkujących jest bardziej wyrozumiałe. Mądrali absolutnie nie udaję, moja wiedza w temacie jest nikła i doskonale zdaję sobie z tego sprawę. I to na tyle nikła, że nie wiem jak zastosować w swoim programie podany przez Ciebie kod.

0

@abbaz, dostałeś działający kod, możesz teraz przeczytać dokumentacje pod kątem każdego z użytych elementów, po czym samodzielnie coś wykombinować.
Czy uważasz że podadzą ci tu streszczenie bardziej treściwe niż dokumentacja?
Tacy roszczeniowcy nigdy do niczego nie dochodzą bo wcześniej czy później każdy takich odsyła ... daleko.

0

Ja pierniczę, faktycznie banał... Bardzo dziękuję za pomoc! :) Wszystko śmiga elegancko.

1 użytkowników online, w tym zalogowanych: 0, gości: 1