Ile razy słowo w pliku?

0

Witam serdecznie
Morduje się z jednym zadaniem od kilku dni i mimo że staram sie większość sam robić tutaj nie mam już siły bo utknąłem w myślę że na prostej pętli.

Zadanie ma wyświetlać ile razy występuje w pliku słowo.

Więc co zrobiłem:

  • Wczytałem plik
  • Umieściłem dane z pliku w tablicy
  • Posortowałem tablicę aby te same nazwy były obok siebie
  • Kolejnym krokiem miała być pętla która zlicza czy są powtórzenia nazwy i tu właśnie utknąłem.
    Proszę o pomoc.
    Oto kod:
import java.util.*;
import java.io.*;

public class LbSlow2 {

    static ArrayList<String> Users = new ArrayList<String>();
    public static void main(String[] args) {

        try {
            File file1 = new File("Plik.txt");
            Scanner Filereader1 = new Scanner(file1);
            while (Filereader1.hasNextLine()) {
                int i = 0;
                String Name = Filereader1.next();
                Users.add(i, Name);
                i++;
            }

           Object[] elements = Users.toArray();
           java.util.Arrays.sort(elements);
             for (int a = 0; a < elements.length; a++) {
                  System.out.println(elements[a]);
                                    }
     

      int a=0; 
      int porownanie=0;
 
      if (elements[a].equals(elements[a+1])==true){
    	 while (elements[a].equals(elements[a+1])==true){
          
  
    	 porownanie++;
    	 a++;
    	 System.out.println("a = "+a);
    	 System.out.println(porownanie);
    	                                 }
    	 }
      }
 
     catch (FileNotFoundException e) {
           System.out.println("error" + e);
        }

    }
}
0

masz moją klasę co kiedyś na zaliczenie pisałem


import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Zliczanie {

    public static void zlicz(File f, List<Slowo> slowa, boolean ignoreCase) {
        Pattern pattern = Pattern.compile("(\\w+)");

        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader(f));
            String line = null;
            while ((line = br.readLine()) != null) {
                Matcher m = pattern.matcher(line);
                while (m.find()) {
                    String wyraz = m.group();

                    for (Iterator<Slowo> it = slowa.iterator(); it.hasNext();) {
                        Slowo slowo = it.next();

                        if ((ignoreCase && wyraz.equalsIgnoreCase(slowo.getSlowo())) ||
                                (!ignoreCase && wyraz.equals(slowo.getSlowo()))) {
                            slowo.addIle();
                        }
                    }
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }

    public static class Slowo {

        private String slowo;
        private int ile;

        public Slowo(String slowo) {
            this.slowo = slowo;
        }

        public int getIle() {
            return ile;
        }

        public void addIle() {
            ile++;
        }

        public String getSlowo() {
            return slowo;
        }

        @Override
        public String toString() {
            return slowo + "[" + ile + "]";
        }
    }

    public static void main(String[] args) {
        File f = new File("README.TXT");
        System.out.println("File: " + f.getName());


        System.out.println("\n---------------------");
        System.out.println("ignore case");
        System.out.println("---------------------\n");

        ArrayList<Slowo> list = new ArrayList<Slowo>();
        list.add(new Slowo("Java"));
        list.add(new Slowo("project"));

        Zliczanie.zlicz(f, list, true);
        for (Iterator<Slowo> it = list.iterator(); it.hasNext();) {
            System.out.println(it.next());
        }

        System.out.println("\n---------------------");
        System.out.println("no ignore case");
        System.out.println("---------------------\n");


        list = new ArrayList<Slowo>();
        list.add(new Slowo("Java"));
        list.add(new Slowo("project"));

        Zliczanie.zlicz(f, list, false);
        for (Iterator<Slowo> it = list.iterator(); it.hasNext();) {
            System.out.println(it.next());
        }
    }
}

0

W przypadku, gdy zadanie polega na zliczeniu czegoś najlepiej użyć struktury słownika, w przypadku javy - np. klasy HashMap

public class Counter<T>
{
	private Map<T, Integer> items = new HashMap<T, Integer>();
	
	public void addItem(T item)
	{
		int count = 0;
		if(items.containsKey(item))
			count = items.get(item);
		
		count++;
		items.put(item, count);
	}
	
	public int getCount(T item)
	{
		if(items.containsKey(item))
			return items.get(item);
		
		return 0;
	}
}
0
pecet napisał(a)

masz moją klasę co kiedyś na zaliczenie pisałem

Dziękuję bardzo za odpowiedź ale zdaje sie że Twój program zlicza liczbę określonych słów. Mi chodziło o liczbę wszystkich słów w pliku i ile razy to słowo występuje. Choć w zasadzie zaciąłem się na pętli i chciałem prosić o pomoc w jej rozwiązaniu bo pętla:


            Object[] elements = Users.toArray();
           java.util.Arrays.sort(elements);
            for (int a = 0; a < elements.length; a++) {
                System.out.println(elements[a]);
                      }
     

      int a=0; 
      int porownanie=0;
 
      if (elements[a].equals(elements[a+1])==true){
    	 while (elements[a].equals(elements[a+1])==true){
          
  
    	 porownanie++;
    	 a++;
    	 System.out.println("a = "+a);
    	 System.out.println(porownanie);
    	 }
    	 }
      }

Wyświetla

Ala
Ala
Ala
Gosia
Gosia
Zosia
Zosia
Zuza
a = 1
1
a = 2
2

Powyższy wynik jest całkowicie logiczny! Wyszło że są 2 powtórzenia, tj. po wystąpieniu false pętla jest przerywana bo index2 w tablicy jest różny od index3 (Ala!=Gosia). Powinno tu dawać wynik 0. I tak dalej, czyli żeby pętla przeskakiwała do kolejnych porównań stringów tj index3 z index4 tablicy tj Gosia i Gosia, co powinno dawać 1. Następnie kolejny false i wartość 0, i znowu wartość 1 bo Zosia i Zosia.
Wydaje się proste, ale braki w budowie pętli i myślenia wielowątkowego dają o sobie znać!!!!

W przypadku, gdy zadanie polega na zliczeniu czegoś najlepiej użyć struktury słownika, w przypadku javy - np. klasy HashMap

Tak też znalazłem program który to wykorzystuje i faktycznie to jest chyba najszybszy sposób zliczania (o ile się go zrozumie :-D ).

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