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