Kolekcje - Utknąłem

0

Cześć. Mam pewne zadanko którego część już zrobiłem ale utknąłem - nawet nie w połowie :/
Oto treść:
Napisać program, który wczytuje plik tekstowy (duży) i wyróżnia w nim słowa (ciągi znaków rozdzielone białymi znakami i znakami punktuacji), przy czym:

a) tworzy kolekcję wszystkich słów z pliku, w taki sposób, by dostęp do np. słowa o numerze 20000 był bardzo szybki,
b) tworzy kolekcję wszystkich słów z pliku posortowaną w kolejności rosnącej,
c) sortuje tę kolekcję w kolejności malejącej,
d) w kolekcji z punktu b), poczynając od końca, dopisuje przed każdym jej słowem kolejne słowo z kolekcji z punktu a) - poczynając od jej początku,
e) wypisuje wynikowe kolekcje z punktu a), b), c), d).
f) wypisuje wszystkie niepowtarzające się słowa w kolejności ich występowania w pliku,
g) wypisuje wszystkie niepowtarzające się słowa w kolejności rosnącej,
h) zlicza liczbę wystąpień wszystkich niepowtarzających się słów w pliku i pokazuje wynik,
i) j.w. ale w taki sposób by łatwo było pokazać wynik posortowany w rosnącej kolejności alfabetycznej; oczywiście ten wynik też nalezy wyprowadzić.

Uwaga: należy użyć właściwych rodzajów kolekcji do każdego z pod zadań.

A tyle udało mi się już zrobić:

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


public class Zadanie_3 {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new FileReader("plik.txt"));
		String linia = null;
		List<String> lista = new ArrayList<>();
		while ((linia = br.readLine()) != null) {
			String[] tab = linia.split(" ");
			for (String t : tab) {
				lista.add(t);
			}
		}
		System.out.println("SLOWO O INDEKSIE 20 000: " + lista.get(20000));
		Collections.sort(lista); //sortuje liste
		System.out.println(lista.toString()); // wypisuje liste
		Collections.reverse(lista); // odwraca kolejnosc listy
		System.out.println(lista.toString()); // wypisuje liste
		
		
	}
}

Bardzo proszę o pomoc w kolejnych podpunktach.

0

Ale nawet to co masz jest źle. Musisz skopiować sobie te kolekcje tak żeby mieć osobno "kolekcje z punktu a, b oraz c" (i teraz jeszcze d!)
Następnie musisz użyć pętli for żeby przelecieć po tych kolekcjach i po prostu paruj sobie takie slowa w nowej kolekcji.

0

Idąc zgodnie z wymaganiami zadania masz złego splita bo masz napisane, że ciągi znaków rozdzielone białymi znakami i znakami punktuacji. A masz tylko po " " nie wiem czy chodzi o znaki interpunkcji czy jakieś inne ale jak masz interpunkcji to split split powinnien wyglądać miniej więcej tak

split(",| |\\. |\\.")

albo jeśli masz coś takiego ala13 ola14

split("[0-9]+ | ")

Na pewno samo split(" ") nie wystarczy bo będziesz miał jakieś znaki interpunkcyjne albo numery razem z słowami.

0

masz również niepoprawną metodę zastosowaną dla kolekcji sortującej w kolejności malejącej.
Zastosuj Collections.reverseOrder() . Dla pod punktu f) oraz g) zobacz w dokumentacji :
http://docs.oracle.com/javase/tutorial/collections/interfaces/set.html

	
BufferedReader br = new BufferedReader(new FileReader("plik.txt"));
		String linia = null;
		List<String> lista_a = new ArrayList<>();
		while ((linia = br.readLine()) != null) {
			String[] tab = linia.split(",| |\\. |\\.");
			for (String t : tab) {
				lista_a.add(t);
			}
		}
		System.out.println("SLOWO O INDEKSIE 3: " + lista_a.get(3));

		System.out.println(" lista: ");
		for (String str_sort_lista_a : lista_a)
			System.out.println(str_sort_lista_a);

		System.out.println("----------------");

		System.out.println("posortowana lista w kolejnosci rosnocej: ");
		List<String> lista_b = new ArrayList<String>(lista_a);
		Collections.sort(lista_b); // sortuje liste

		for (String str_sort_lista_b : lista_b)
			System.out.println(str_sort_lista_b);

		System.out.println("----------------");

		System.out.println("posortowana lista w kolejnosci malejacej: ");
		List<String> lista_c = new ArrayList<String>(lista_a);

		Collections.sort(lista_c, Collections.reverseOrder());

		for (String str_sort_lista_c : lista_c)
			System.out.println(str_sort_lista_c);

		System.out.println("----------------");

		System.out.println("do listy dodaj liste b ");

		List<String> lista_d = new ArrayList<String>(lista_a);
		Collections.sort(lista_d, Collections.reverseOrder());

		List<String> lista_dd = new ArrayList<String>(lista_a);
		int len = lista_d.size();
		int len2 = lista_dd.size();
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < len; i++) {
			for (int ii = 0; ii < len2; ii++) {
				if (ii == i)
				sb.append(lista_d.get(i).toString()).append(" ")
						.append(lista_dd.get(i).toString()).append(" \n");

			}

		}
		System.out.println(sb.toString());

	}

Polecam , abyś skorzystał z dokumentacji:
http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html
http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html

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