zliczanie słów, które nie powtarzają się

0

Witam,

Mam program do zliczania słów w Javie. Problem w tym, aby nie zliczał słów powtarzających się.


import java.util.*;
import java.io.*; 
public class ZliczanieStringów {

    public static void main(String[] args) {
        String[] strings = {"Ala", "ma", "kota", "Ala", "Ala"};
        for(String s : strings) System.out.print(s + ",");
        Arrays.sort(strings);
        System.out.println();

        int licznik = 0;
        for(String s : strings)
        {
            if (s.equals(s+1))
                System.out.println("Powtarza się" + s);
            else 
                licznik++;
        }
        System.out.println("Ilość słów: " + licznik);   

    }

}

Mam problem z ifem, if (s.equals(s+1)) ...

Proszę o pomoc.

1

Zrób zwykłym for'em -> for(int i=0 ....

0

Jeżeli s="Ala", to s+1="Ala1". Można też bez sortowania:

import java.util.*;

public class ZliczanieStringow
{

        public static void main(String[] args) 
        {
            String[] strings = {"Ala", "ma", "kota", "Ala", "Ala"};
            System.out.println(Arrays.toString(strings));
            Set<String> niepowtarzalne=new HashSet<String>();
            for(String s : strings)
            {
                niepowtarzalne.add(s);
            }
            System.out.println("Ilość słów: " + niepowtarzalne.size());
        }
}
0

Lepiej raczej skorzystać z odpowiedniego konstruktora:

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class Main {

    public static void main(String[] args) {
        String[] strings = {"Ala", "ma", "kota", "Ala", "Ala"};
        System.out.println(Arrays.toString(strings));
        Set<String> niepowtarzalne = new HashSet<String>(Arrays.asList(strings));
        System.out.println(niepowtarzalne.toString());
    }
}
1

Weźcie mi tu takich czarów nie pokazujcie bo jeszcze polubię Jave :/

0

Skomplikowany ten Wasz kod.

Czytam książkę C++. Potęga języka. Na podstawie takiego kodu (niżej) autor zlecił owe zadanie na obliczanie słów i kombinowałem z tym sortowaniem w javie

  • myślałem, że obędzie się bez klepania algorytmu sortującego i skorzystanie z gotowej metody.

Pytanie, czy na podstawie tego kodu, można wykonać obliczanie ilości stringów?


#include <algorithm>
#include <iomanip>
#ifndef __GNUC__
#include <ios>
#endif
#include <iostream>
#include <string>
#include <vector>

using std::cin;             using std::sort;
using std::cout;            using std::streamsize;
using std::endl;            using std::string;
using std::setprecision;    using std::vector;

int main()
{
    // zapytaj o imię studenta
    cout << "Podaj swoje imię: ";
    string name;
    cin >> name;
    cout << "Witaj, " << name << "!" << endl;

    // zapytaj o oceny z kolokwiów i ocenę z egzaminu końcowego
    cout << "Wprowadź swoje oceny pośrednie i ocenę z egzaminu: ";
    double midterm, final;
    cin >> midterm >> final;

    // zapytaj o oceny zadań domowych
    cout << "Wprowadź wszystkie posiadane oceny zadań domowych, "
            "listę ocen zakończ znakiem końca pliku: ";

    vector<double> homework;
    double x;
    // niezmiennik: homework zawiera wszystkie odczytane do tej pory oceny
    while (cin >> x)
        homework.push_back(x);

    // sprawdź, czy student podał jakieś oceny
#ifdef _MSC_VER
    typedef std::vector<double>::size_type vec_sz;
#else
    typedef vector<double>::size_type vec_sz;
#endif
    vec_sz size = homework.size();
    if (size == 0) {
        cout << endl << "Musisz wprowadzić oceny. Spróbuj jeszcze raz." << endl;    
        return 1;
    }

    // posortuj oceny
    sort(homework.begin(), homework.end());

    // oblicz medianę ocen zadań domowych
    vec_sz mid = size/2;
    double median;
    median = size % 2 == 0 ? (homework[mid] + homework[mid-1]) / 2
                           : homework[mid];

    // oblicz i wyprowadź ocenę końcową studenta
    streamsize prec = cout.precision();
    cout << "Twoja ocena semestralna to " << setprecision(3)
         << 0.2 * midterm + 0.4 * final + 0.4 * median
         << setprecision(prec) << endl;

    return 0;
}
1

Nie. Ten kod jest do czego innego. Ale w C++ jest odpowiednik java.util.HashSet pod nazwą std::set. std::vector to odpowiednik java.util.ArrayList.

#include <iostream>
#include <set>
#include <string>
#include <vector>

int main(int argc, char** argv) {

    std::string napisy[] ={"Ala", "ma", "kota", "Ala", "ma"};
    std::vector<std::string> wektor(napisy, napisy + 5);
    std::cout << wektor.size() << std::endl;
    std::set<std::string> zbior(wektor.begin(), wektor.end());
    std::cout << zbior.size() << std::endl;
    return 0;
}
0
Wibowit napisał(a)

Nie. Ten kod jest do czego innego. Ale w C++ jest odpowiednik java.util.HashSet pod nazwą std::set. std::vector to odpowiednik java.util.ArrayList.

Mocno prymitywnie napisałem taki kawałek kodu na wektorze w C++. Powiem tak, że Wasz kod jeszcze jest dla mnie zbyt skomplikowany
i poleciałem forem.


#include "stdafx.h"
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Wprowadz ciag stringow " << endl;
    string x;
    vector<string> ciagiZnakow;

    while (cin >> x)
        ciagiZnakow.push_back(x);

    typedef vector<string>::size_type vec_sz;
    vec_sz size = ciagiZnakow.size();
    if(size == 0)
    {
        cout << endl << "Musisz wprowadzic stringi. Sprobuj jeszcze raz. " << endl;
        return 1;
    }

    sort(ciagiZnakow.begin(), ciagiZnakow.end());

    int licznik = 0;
    for (int i = 0; i < ciagiZnakow.size() -1 ; i++)
        if (ciagiZnakow[i] == ciagiZnakow[i+1])
            cout << "powtarza sie" << ciagiZnakow[i];
        else
            licznik++;

    cout << licznik + 1 << endl;
    system("pause");
    return 0;               
}

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