sortowanie pliku - proszę o wskazówki

0

Mam taki temat zadania:

Napisz program stanowiący wersję polecenia ‘sort’ znanego z Unixa.
Uwaga: Program ma sortować zadany plik. Ponadto program powinien móc pracować
w potoku. Poniższe opcje winny być wspierane:
-d ”Dictionary” order: tylko literym cyfry i puste pola (spacje i tabulacje) są znaczące;
-i ignoruje non-printable znaki;
-n sortuj numerycznie zamiast alfanumerycznie;
-r wyświetl w kolejności malejącej (zamiast rosnącej);
-t znak lub –t”tekst” (po t może być spacja!) znak/tekst stanowi nowy separator pola;
-k n wskazuje które pole (od którego pola) będziemy sortować;
-s ignoruj liczby przy porównywaniu tekstu
-c duże i małe litery nie są rozrózniane
-b ignoruj różne białe znaki i ich liczbę (spacje i tabulacje nie są brane pod uwagę przy
sortowaniu)
Opcje powinno dać się łączyć ze sobą i tak –c –r można zapisać jako –cs jak i –sc

Zacinam sie w momencie, jak trzeba zastosowac algorytm sortowania w zaleznosci od podanej opcji przy wywołaniu programu. Jak zaimplementowac kilka algorytmow i potem dokonac odpowiedniego wyboru? Moglby ktos napisac chociaz sama idee jak to trzeba zrobic?

0

z javy nie duzo rozumiem, ale powiem tak:

jak zczytasz parametry, to ustaw w programie globalne zmienne zawierające te parametry
np
is_C_active typu boolean; (czy jak tam jest w Javie)

potem na podstawie tych zmiennych modyfikuj algorytm sortowania

if (is_C_active) then {element_sortowany_na UP_CASE}; // chyba jakos tak

no to tak ideowo...

możesz podesłać kod źródłowy to chętnie pomogę

zamiast globalnych zmiennych mozesz napisac funkcje ktora ma tyle parametrów i wywolać ją zgodnie z wierszem poleceń.

P.S. Sori for maj bad Java

0
Cr0n0 napisał(a)

z javy nie duzo rozumiem, ale powiem tak:
jak zczytasz parametry, to ustaw w programie globalne zmienne zawierające te parametry
np
is_C_active typu boolean; (czy jak tam jest w Javie)
potem na podstawie tych zmiennych modyfikuj algorytm sortowania
if (is_C_active) then {element_sortowany_na UP_CASE}; // chyba jakos tak
no to tak ideowo...
możesz podesłać kod źródłowy to chętnie pomogę
zamiast globalnych zmiennych mozesz napisac funkcje ktora ma tyle parametrów i wywolać ją zgodnie z wierszem poleceń.
P.S. Sori for maj bad Java

No generalnie idea słuszna. Tylko że sam metoda sortowania nie wymaga modyfikacji ani implementacji , wystarczy podejść do tego w ten sposób :
1)Dane do sortowania składają się z wartości (które sortujemy) i kluczy ( według których sortujemy).
2)Klucze powstają w wyniku zastosowania opcji na wartościach np.
przy opcji -s wartość "123shdsj" to klucz według którego dane są sortowane to "shdsj"
3)Jeśli sortowanie ma być numeryczne to algorytm sie nie zmienia , wystarczy zmienić sposób porównywania kluczy 2 elementów. Do sortowania można użyć wbudowanej funkcji sortującej tablice obiektów.
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Comparator.html
http://www.exampledepot.com/egs/java.util/coll_SortArray.html
4)Jeśli porządek ma być rosnący lub malejący to - 1 z nich powinien być stosowany domyślnie, jeśli opcja wskaże inny porządek niż domyślny to wystarczy wyniki wypisać w odwrotnej kolejności .
5)Jednym z parametrów mogą być nazwy plików wejściowych jeśli nazw plików wejściowych nie podano
to wejściem jest klawiatura (ew. plik przekierowany na standardowe wyjście).

Poniżej znajduje się szkielet programu w javie - program nie działa trzeba go dokończyć ;-) .

public class Main {	
 //”Dictionary” order: tylko literym cyfry i puste pola (spacje i tabulacje) są znaczące;
	boolean dictionary;
//	-i ignoruje non-printable znaki;
	boolean ignoreNonePrintable;
	//-n sortuj numerycznie zamiast alfanumerycznie;
	boolean numericSortMethod;
	//-r wyświetl w kolejności malejącej (zamiast rosnącej);
	boolean descendingOrder;
	//-t znak lub –t”tekst” (po t może być spacja!) znak/tekst stanowi nowy separator pola;
	ArrayList<Character> separators;
	//-k n wskazuje które pole (od którego pola) będziemy sortować;
	int startField;
	//-s ignoruj liczby przy porównywaniu tekstu
	boolean ignoreNumbers;
	//-c duże i małe litery nie są rozrózniane
	boolean ignoreUpperCase;
	//-b ignoruj różne białe znaki i ich liczbę (spacje i tabulacje nie są brane pod uwagę przy
	boolean ignoreNullChars;		
	private Comparator<Element> comparator;
	BufferedReader input;	
	public void setOptions(ArrayList<String> options)
	{
		//ustawia zminne na podstawie listy parametrów
	}
	
	public String filterString(String data)
	{
		//transformacja łańcucha znaków zgodnie z opcjami
		//np. jeśli pewien rodzaj znaków jest ignorowany to powinien być usunięty
		//jeśli np. -k 4  to pola od 1 do 3 powinny być usunięta, 
		//a sortowanie tego co pozostało powinno być tylko brane pod uwagę
		return null;
	}
	
	
	
	public void sort(InputStreamReader isr) throws IOException
	{
		input = new BufferedReader(isr);
		
		LinkedList<Element> elements = new LinkedList<Element>();
		String line;
		while(null!=(line = input.readLine()))
		{
			String key = filterString(line);			
			elements.add(new Element(key,line));			
		}				
		Element[] array = new Element[1];
		array = elements.toArray(array);
		//sortowanie , poprzez porównywanie kluczy
		java.util.Arrays.sort(array, comparator);		
		//w tablicy array są posortowane elementy		
	}
	
	public static void main(String[] args) throws IOException
	{	
		/*** Zczytanie parametrów określających opcje
		 * z linii poleceń */
		ArrayList<String> options = new ArrayList<String>();
		ArrayList<String> filenames = new ArrayList<String>();
		if(null!=args )
		{
			for(String param:args)
			{
				if ('-'==param.charAt(0))
				{
					options.add(param.substring(1));				//opcja
				}
				else
				{
					filenames.add(param);				//nazwa pliku
				}
			}
		}
		/*** W efekcie otrzymasz pojedyńczą linię parametrów
		 * oraz listę plików do posortowania.Zainicjuj zmienne boolowskie w klasie. */

		Main program = new Main();
		program.setOptions(options);

ArrayList<InputStreamReader> streams = new ArrayList<InputStreamReader>(filenames.size()+1);
		if (0==filenames.size())
		{
			 streams.add(new InputStreamReader(System.in));
		}
		else
		{
			for(String fileName:filenames)
			{				
				try {
					streams.add(new InputStreamReader(new FileInputStream(fileName)));
				} catch (FileNotFoundException e) {
					System.out.println(e.getMessage());					
				}
			}
		}		
		
		for(InputStreamReader in:streams)
		{
			program.sort(in);
			in.close();
		}								
	}
}

class Element 
{
	public final String key;//klucz według którego sortujemy
	public final String value;	//wartość któ¶ą sortujemy
	public Element(String k,String v)	
	{
		key=k;
		value=v;
	}
}

class NumericCmp implements Comparator<Element>
{	
	public int compare(Element o1, Element o2) {
		// wykonaj porównywanie numeryczne		
	}	
}

class AlfanumCmp implements Comparator<Element>
{
	public int compare(Element o1, Element o2) {
		// porównaj 2 elementy zgodnie z porządkiem alfa numerycznym		
	}	
}

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