Sortieren einer Gliederung

Status
Nicht offen für weitere Antworten.

M@usi

Neues Mitglied
Hallo,

ich möchte gern zahlen sortieren und das klappt ja auch wunderbar, nun möchte ich aber auch Zahlen sortieren mit mehreren Punkten, also Gliederungszahlen z.B. 1.1.1, 4.1 usw.

Code:
import java.util.*; 

class Sort 
{ 
public static void main (String [] args) 
{ 
	double[] arr = {4.4,4.1,2,3,4}; 
  
	Arrays.sort(arr); 
  
	for(int i=0; i<arr.length; i++) 
			System.out.print(arr[i]+ " "); 
  
	MyClass object = new MyClass(); 
	System.out.println(object.alleVerschieden(arr)); 
} 
} 


class MyClass 
{ 
	boolean alleVerschieden (double[] a) 
	{ 
	boolean rueckgabe = true; 
  
  
	for(int i=0; i<a.length-1; i++) 
	{ 
		if(a[i]==a[i+1]) 
			rueckgabe = false;    
		else                          
			rueckgabe = true; 
	} 
	return rueckgabe; 
	} 
}

nun komme ich irgendwie nicht so wirklich voran, vielleicht hat ja jemand von euch einen Vorschlag wie ich das umsetzen könnte, würde mich sehr über eine antwort freuen!

Danke M@usi
 
Mach Strings draus, hau sie in eine Liste, und benutzt die sort() Funktion der Collections Klasse..


Etwa so:

Code:
  List l = new ArrayList();
  l.add("4.4");
  l.add("1.2");
  l.add("3.2.3");

  Collections.sort(l);
 
Mach Strings draus, hau sie in eine Liste, und benutzt die sort() function desr Collections Klasse..
Am besten erzeugst du Double-Objekte und lässt diese über Collections.sort( liste ) sortieren, denn Strings werden asciibetisch sortiert.
 
double Objekte habe ich auch schon überlegt..

aber gibt es nicht probleme bei 1.1.2 usw. also mit mehreren Punkten ?

außerdem gibt es solange kein Problem bis die punkte nicht bis 10 oder so gehen ;-)
 
Code:
boolean alleVerschieden (double[] a) 
   { 
   boolean rueckgabe = true; 
  
  
   for(int i=0; i<a.length-1; i++) 
   { 
      if(a[i]==a[i+1]) 
         rueckgabe = false;    
      else                          
         rueckgabe = true; 
   } 
   return rueckgabe; 
   }

die if- else verzweigung is falsch, das else ist zuviel. weil in diesem fall wie du es gerade hast da würde er den wert der letzten schleife zurückgeben, weil die die eventuellen false werte in der nächsten schleife wieder überschreibst. also sollte sie folgendermaßen aussehen

Code:
boolean alleVerschieden (double[] a) 
   { 
   boolean rueckgabe = true; 
  
  
   for(int i=0; i<a.length-1; i++) 
   { 
      if(a[i]==a[i+1]) 
         rueckgabe = false;    
   } 
   return rueckgabe; 
   }

bye
 
deathbyaclown hat gesagt.:
double Objekte habe ich auch schon überlegt..
aber gibt es nicht probleme bei 1.1.2 usw. also mit mehreren Punkten ?

Darum auch Strings...
Bei 10 fängt das Problem an, da diese dann halt immer noch hinter 2 kommen.
Eine andere Möglichkeit wäre die "Zahlen" zu spliten, und die Teile einzeln zu sortieren...
 
ich hab das jetzt mit dem Strin und der liste mal versucht aber der meckert, das Semikolon in der Stringdefinition an und ich finde nicht heraus warum!

geht das denn so nicht und wenn wie anders?

Code:
class Sort
{ 
public static void main (String [] args) 
{ 
	String l[]={"4.4" ,"1.2 " , "3.2.3";}; // hier will er das erste Semikolon nicht????
	
	List l = new ArrayList(); 
	l.add("4.4"); 
	l.add("1.2"); 
	l.add("3.2.3"); 

	Collections.sort(l); 

	 } 
}
 
warum sollte er es auch wollen 😉
es ist syntaktisch falsch....
Code:
String[] l={"4.4" ,"1.2 " , "3.2.3"};
 
gut danke soviel dazu 😳

wie siehts denn nun aus, wenn ich mehrer gliederung über Console einfügen will....

ich gebe z.B. ein "1.2.3 Überschrift"

und danach ein weiterem punkt "1.1.1 Bla"

dann würde es doch am besten sein, wenn ich dies in eine Liste packe!
muss ich dann zuerst die Gliederung aufsplitten und dann in die liste oder umgekehrt!

weiß nicht genau wie ich da anfangen soll :cry:

wäre echt lieb wenn jemand nen großen denkanstoß hat für mich :wink:

danke M@usi
 
Denkanstoss 😉 :
Code:
public class MyClass {

   public static void main(String[] a) {
    
      List l = new ArrayList();
      l.add("4.4.1.2");
      l.add("1.2");
      l.add("3.2.3");
      l.add("5.3.2.4");
      Collections.sort(l);
      for (int n=0;n<l.size();n++) {
         System.out.println(l.get(n));
      }
   }
}

Du darfst einfach keine Nummer über 10 haben...
 
Vielleicht hilft diese Methode:



Code:
	public static String[] sortiereNachGliederungspunkten(String[] gliederung){
		String[] enum = new String[gliederung.length];
		int length = 0;
		int max = 0;
		for(int k = 0; k < enum.length; k++){
			StringTokenizer st = new StringTokenizer(gliederung[k]);
			enum[k] = st.nextToken();
			if(length < enum[k].length()){
				length = enum[k].length();
			}
		}
		
		String[][] matrix = new String[gliederung.length][];
		
		for(int k = 0; k < enum.length; k++){
			StringTokenizer st = new StringTokenizer(enum[k], ".");
			String[] token = new String[st.countTokens()];
			int index = 0;
			while(st.hasMoreTokens()){
				String entry = st.nextToken();
				if(max < entry.length()){
					max = entry.length();
				}
				token[index++] = entry;
			}
			matrix[k] = token;
		}
		
		for(int k = 0; k < matrix.length; k++){
			String str = "";
			for(int c = 0; c < matrix[k].length; c++){
				while(matrix[k][c].length() < max){
					matrix[k][c] = "0" + matrix[k][c]; 
				}
				str += matrix[k][c];
			}
			while(str.length() < length){
				str += "0";
			}
			enum[k] = str;
		}
		
		matrix = null;
		
		HashMap map = new HashMap();
		
		for(int k = 0; k < enum.length; k++){
			map.put(enum[k], gliederung[k]);
		}
		
		Arrays.sort(enum);
				
		String[] result = new String[gliederung.length];
	
		for(int k = 0; k < result.length; k++){
			result[k] = map.get(enum[k]).toString();
		}
		return result;
	}




hatte mal das gleiche Problem und bei kamen Nummern über 10 vor. Vielleicht nicht gerade die cleverste Implementierung, aber soweit ich informaiert bin funktioniert sie.

Illuvatar: Codetags!!! :noe:
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben