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
}
}