Sortowanie listy wg liczby elementów

0

Zadanie (a dokładniej jego część) jest takie: W pliku allwords.txt, znajdującym się w katalogu {user.home} zapisane są (rozdzielone białymi znakami) słowa. Znaleźć wszystkie anagramy, które można utworzyć z tych słów i wypisać je jako listy słów na konsoli w porządku liczby anagramów. Przy takiej samej liczbie anagramów listy wypisywane są w porządku alfabetycznym pierwszego słowa na liście.

Kod klasy Main (nie można go modyfikować) dla tego zadania wygląda tak:

import java.io.*;
import java.util.*;

public class Main {
  public static void main(String[] args) throws FileNotFoundException {
    String home = System.getProperty("user.home");
    String allWords = home + "/allwords.txt";
    Anagrams an = new Anagrams(allWords);
    for(List<String> wlist : an.getSortedByAnQty()) {
      System.out.println(wlist);
    }
    System.out.println("************************");
}
}

Mam taki kod klasy Anagrams:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Anagrams {

	List<ArrayList<String>> listaAnagramow = new ArrayList<ArrayList<String>>();
	
	public Anagrams(String allWords) throws FileNotFoundException {
		Scanner scan = new Scanner (new File(allWords));
		List <String> slowa = new ArrayList<String>();
		while (scan.hasNext()) {
				  slowa.add(scan.next());
			  }
			
		scan.close();
			  
		while (slowa.isEmpty() == false) {
			ArrayList<String> anagramy = new ArrayList<String>();
			String wzor = slowa.remove(0);
			anagramy.add(wzor);
			char[] ch = wzor.toCharArray();
			Arrays.sort(ch);
			for (int i = 0; i<slowa.size(); i++) {
				String slowo = slowa.get(i);
				char[] cha = slowo.toCharArray();
				Arrays.sort(cha);
				if (Arrays.equals(ch, cha)) {
					anagramy.add(slowo);
					slowa.remove(i);
					i--;
				}
			}
			listaAnagramow.add(anagramy);
		}
}

	public List<ArrayList<String>> getSortedByAnQty() {
		return listaAnagramow;
	}
}

Wyszukiwanie anagramów działa prawidłowo - tzn. tworzy się odpowiednia lista list i jest wyprowadzana na konsolę. Natomiast nie umiem sobie poradzić z jej posortowaniem zgodnie z wymaganiami zadania, czyli żeby kolejne listy anagramów były prezentowane zaczynając od tej, która zawiera ich najwięcej (a jeżeli dwie listy zawierają ich tyle samo - to w porządku alfabetycznym).
Jak to ugryźć?

0

Utwórz klasę AnagramsOfOneWord

class AnagramsOfOneWord{
    List<String> anagrams = new ArrayList<String>();
    public AnagramsOfOneWord(String word){
    ...
    }
    public int compareTo(Object ob){
    ...
    }
}

Konstruktor tworzy (uporządkowaną alfabetycznie) listę wszystkich anagramów słowa word. Mam nadzieje, że wiesz jak wywołać metodę sort, żeby sortowanie było alfabetyczne, tzn. żeby ignorowało wielkość liter i dobrze porządkowało polskie litery.
W metodzie compareTo porównujesz wpierw rozmiar listy anagrams, w drugiej pierwsze słowa z list.
Potem wystarczy wywołać metodę sort dla listy list.

0

Dzięki za podpowiedź, ale żadne nowe klasy nie mogą być tworzone.
Poradziłem sobie z tym trochę inaczej:

Collections.sort(listaAnagramow, new Comparator<ArrayList<String>>() {
				  public int compare(ArrayList<String> a1, ArrayList<String> a2) {
				    if (a2.size() != a1.size()) {
					  return a2.size() - a1.size();
				    }
				    else {
				    	if (a1.get(0).compareTo(a2.get(0)) > 0) return 1;
				    	else return -1;
				    }				    	
				  }
				});
0

ale żadne nowe klasy nie mogą być tworzone

Ta informacja powinna być już w pierwszym poście.

0

Sam dowiedziałem się o tym wymaganiu niedawno...

1

W takim razie to rozwiązanie, które Ty zaproponowałeś także jest niepoprawne. Tworzysz tam klasę anonimową implementującą interfejs Comparator<ArrayList<String>>.

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