Suche und Sortieren in Arrays

Status
Nicht offen für weitere Antworten.

TheDestroyer

Aktives Mitglied
Hey, hab jetzt ne Aufgabe in welcher ich einen Array erstellen und diesen mit Zufallszahlen füllen soll, was auch klappt. Dann soll ich diesen Array auch sortieren und eine Suche soll ich auch mit einbauen. Leider hab ich bei der Ausgabe des Sortierens einen kleinen Fehler , denn es wird "null" mit ausgegeben. Wie bekomme ich das weg. Weiss dass das an "static String ausgabe = null;"liegt. Muss ich das dann bei der Suche so machen, das ich angebe, welche stelle des Arrays er mir ausgeben soll oder funktioniert das anders?

Code:
package Tut2;

import java.util.BitSet;
import java.util.Random;
import java.util.*;
public class tut2 {
	final static BitSet number =new BitSet();
	final static int[] numbers	= new int [10];
	static int i = 0;
	static String ausgabe = null;
	
	public static void main (String []args){
		zahlen();
		sort();
	}
	
	public static int zahlen(){
					
		Random randomizer1 = new Random();
			
		while (i < 10){
			numbers[i] = (byte)(1 + (Math.abs(randomizer1.nextInt())%49));
			if (!number.get(numbers[i])){
				number.set(numbers[i]);
				i++;
			}
		}
		for (int j =0; j < numbers.length; j++){
			System.out.println("Zahl " + j + " =" + numbers[j]);
			
		}
		return i;
	}
	
	public static int sort(){
		java.util.Arrays.sort(numbers); 
        
        
		for(int name : numbers) 
           ausgabe += name + "\n"; 
		
		System.out.println(ausgabe);
		return i;
	}
	public static void search(){
		
	}

}
 
gibts vogaben, wie sortiert werden soll? wenn naemlich nicht, wuerd ich Arrays.sort nehmen :wink:

gruesse
 
nee also beim sortieren steht nichts da, halt nur als zusatz vielleicht InsertionSort. Muss man net machen!!!

Aber ich habe doch array.sort drinnen, oder stimmt damit etwas nicht????
 
schreib mal beim string oben nicht null, sondern ""...dann sollte es gehen. also praktisch so:

Code:
public class tut2 {
    final static BitSet number =new BitSet();
    static int[] numbers   = new int [10];
    static int i = 0;
    static String ausgabe = "";
    
    public static void main(String []args){
        zahlen();
        sort();
    }
    
    public static int zahlen(){
        
        Random randomizer1 = new Random();
        
        while (i < 10){
            numbers[i] = (byte)(1 + (Math.abs(randomizer1.nextInt())%49));
            if (!number.get(numbers[i])){
                number.set(numbers[i]);
                i++;
            }
        }
        for (int j =0; j < numbers.length; j++){
            System.out.println("Zahl " + j + " =" + numbers[j]);
            
        }
        return i;
    }
    
    public static int sort(){
        java.util.Arrays.sort(numbers);
        
        for(int name : numbers)
            ausgabe += name + "\n";
        
        System.out.println(ausgabe);
        return i;
    }
    public static void search(){
        
    }
    
}

und bitte an die java code conventions halten...namen fuer klassen gross!

gruesse
 
danke, weiss denn jemand wie das bei der suche läuft. sucht er dann nach einem Array an bestimmter Stelle, also 2.Stelle?
 

Sorts the specified array of ints into ascending numerical order. The sorting algorithm is a tuned quicksort, adapted from Jon L. Bentley and M. Douglas McIlroy's "Engineering a Sort Function", Software-Practice and Experience, Vol. 23(11) P. 1249-1265 (November 1993). This algorithm offers n*log(n) performance on many data sets that cause other quicksorts to degrade to quadratic performance.


gruesse
 
Hab hier jetzt mal den Code mit ner Suche drinnen. Kann man das denn so machen, sprich ist die Suche ok.
Code:
package Tut2;

import java.util.BitSet;
import java.util.Random;
import java.util.*;
public class tut2 {
	final static BitSet number =new BitSet();
	final static int[] numbers	= new int [10];
	static int i = 0;
	static String ausgabe = "";
	
	public static void main (String []args){
		zahlen();
		sort();
		search();
	}
	
	public static int zahlen(){
					
		Random randomizer1 = new Random();
			
		while (i < 10){
			numbers[i] = (byte)(1 + (Math.abs(randomizer1.nextInt())%49));
			if (!number.get(numbers[i])){
				number.set(numbers[i]);
				i++;
			}
		}
		for (int j =0; j < numbers.length; j++){
			System.out.println("Zahl " + j + " =" + numbers[j]);
			
		}
		return i;
	}
	
	public static int sort(){
		java.util.Arrays.sort(numbers); 
        
        
		for(int name : numbers) 
           ausgabe += name + "\n"; 
		
		System.out.println(ausgabe);
		return i;
	}
	
	
	public static void search(){
	System.out.println(numbers[5]);
	}
	
}
 
na ja, ist ja nicht wirklich ne suche..du gibst ja nur ein element des arrays aus. man muesste eine zahl uebergeben und schauen, ob die drinnen ist, also so inder art:

Code:
search(int numberToSearch){
    for(int i=0; i<array.length; i++){
        if(array[i]==numberToSearchFor){
            //drinne
        }else{
            //nicht drinne
        }
}

so in der art. natuerlich kann eine nummer ja auch mehrmals drin sein etc pp...da koennte man dann mitzaehlen und so weiter.

viele gruesse
 
Also das hier ist mein erster Beitrag....

... erstmal einiges vorweg:

- bei einer Übung in der man was sortieren soll kann man im Normalfall davon ausgehen, dass die Sortierfunktion selbst geschrieben werden soll. So sehe ich das zumindest. Ein einfacher Aufruf à la "sort()" ist hier sicher nicht gefragt, denn ein Referenzhandbuch kann jeder lesen. Hier geht es eher darum mit den Standard Datenstrukturen (hier ein Array) umzugehen.

- wie bereits oben schon jemand erwähnte: Klassennamen bitte capital letter at the beginning ;-) und dann gib der ganzen Geschichte mal einen gescheiten Namen. Wirst in 2 Monaten doch keinen Schimmer mehr haben was die Klasse macht.

- und "import java.util.*;" kannst du weglassen! du importierst die beiden classen ja schon mit vollem klassenpfad namen.


Weshalb ich eigentlich schreibe ist aber deine Suchfunktion. du suchst ja gar nicht, sondern gibst einfach mal die 5. stelle vom Array aus. So einfach ist das leider nicht mit dem Programmieren ;-) Du sollst denke ich mal eine Funktion schreiben die wie folgt aufgerufen wird: "find (2)" oder allgemein "find(int value)" die dann die Stelle der Zahl <value> im Array zurückgibt, so dass du dann direkt auf das gesuchte "Objekt" (eigentlich ja "primtive") zugreifen kannst.

Das heißt, deine Funktion gibt also auch noch was zurück - nämlich eine integer der die position der gesuchten zahl zurückgibt. sie muss also so aussehen: "int find(int value)". Was aber wenn der Array den gesuchten Wert gar nicht enthält? Ich würde dann "-1" zurückgeben, da es diese Stelle nicht gibt innerhalb eines Arrays.

Da du den Array vorher sortiert hast kannst du zum Suchen einen sehr einfachen Algorithmus verwenden, der aber verdammt effizient ist (der Stand sogar in vereinfachter Form mal in nem Mickey Mouse Heft - an was man sich alles erinnert). Ich werde einfach mal kurz das prinzip erklären:

angenommen du darfst dir ne Zahl zwischen 1 und 128 aussuchen. jemand anderst kann diese zahl rausbekommen wenn er 8 fragen stellt die du immer nur mit ja oder nein beantwortest. er wird danach die zahl kennen.

1 frage: ist die zahl größer als 64 (=128/2) ?? falls ja:
2 frage: ist die zahl größer als 64 + 32 (= 128/2 + 128/4) ?? falls ja....

usw... ich denke das prinzip ist klar - eingrenzen des wertebereichs... wenn ein nein als antwort kommt einfach die hälfte des intervalls subtrahieren.


Falls dir das zu kompliziert ist, renn durch den array (benutzt ja schon brav die neue java 1.5 for schleife) und vergleiche einfach das gesuchte mit dem aktuellen wert. wenns passt einfach mit return die aktuelle stelle zurückgeben....

Hoffe das bringt dich weiter... und versuch dich an die konventionen zu halten. ich hasse menschen die ihren code so mies hinschmieren. vor allem wenn ich mich nachher durchwühlen darf... hmpf...


grüße!
 
hab die methode jetzt dinnen, leider gibt er mir abe nicht aus. woran kann denn liegen? ich will ja die Zahl angeben die er suchen will. Soll ich vielleicht das "int numbertosearch" wegnehmen? Ausserdem musste ich feststellen das manchmal die Ausgabe kommt, aber eher selten, wenn das kommt aber 10mal das die Zahl nicht enthalten ist.

EDIT: Also dass das nur mnchmal kam lag an eclipse, hab es neu gestarte und jetzt steht die Ausgabe auch da, allerdings 10mal. Denke er gibt mir für jede Position etwas aus, möchte es aber eigentlich nur für eine Zahl haben.

Code:
public static int search(int numberToSearch){
		for(int i=0; i<numbers.length; i++){ 
	        int numberToSearchFor = 5;
			if(numbers[i]==numberToSearchFor){ 
	           System.out.println("Zahl ist enthalten"); //drinne 
	        }else{ 
	        	System.out.println("Zahl ist leider nicht enthalten"); //nicht drinne 
	        }}
		return i;
	}
 
hei, also du musst die methode aufrufen und eben die suchzahl uebergeben. also wenn du 5 suchen willst, schreibst du ne 5 rein. wenn er die zahl einmal findet, wird 9 mal nicht drin ausgegeben und einmal drin. das kann man verfeinern, indem man sich die stelle(n) merkt und so weiter.

gruesse
 
THX!!! erstmal Hab jetzt noch mal ne Frage. Und zwar ist bei der search-Methode ja return=1 mit dabei. Geht das irgendwie anders, weil er mir bei der Ausgabe die 1 mit ausgibt. Hab jetzt die ganzen Ausgabe in eine eigene Methode geschrieben.
Ach ja... Wir sollen uns mal in den Debugger einarbeiten. Wie kann ich denn jetzt z.b. ein Indexüberlauf machen?
Hier nochmal der Code
Code:
import java.util.*;
public class Tut2 {
	final static BitSet number =new BitSet();
	final static int[] numbers	= new int [10];
	static int i = 0;
	
	static String ausgabe = "";
	
	public static void main (String []args){
		zahlen();
		sort();
		//search();
		Ausgabe();
	}
	/*
	 * Zufallszahlen generieren
	 */
	public static int zahlen(){
					
		Random randomizer1 = new Random();
			
		while (i < 10){
			numbers[i] = (byte)(1 + (Math.abs(randomizer1.nextInt())%49));
			if (!number.get(numbers[i])){
				number.set(numbers[i]);
				i++;
			}
		}
		
		return i;
	}
	/*
	 * vorher generierte Zufallszahlen in sortiereter Form ausgebene
	 */
	public static int sort(){
		java.util.Arrays.sort(numbers); 
        
        
		for(int name : numbers) 
           ausgabe += name + "\n"; 
		
		//System.out.println(ausgabe);
		return i;
	}
	
	/*
	 * Suche einer Zahl in der Zahlenfolge
	 */
	public static int search(){
		for(int i=0; i<numbers.length; i++){ 
	        int numberToSearchFor = 5;
			if(numbers[i]==numberToSearchFor){ 
	           System.out.println("Zahl ist enthalten"); //drinnen 
	        }else{ 
	        	System.out.println("Zahl ist leider nicht enthalten"); //nicht drinnen
	        }
			
		}
		return 1;
	} 
	
	public static int Ausgabe(){
		
		System.out.println("Ausgabe der Zufallszahlen");
		for (int j =0; j < numbers.length; j++){
			System.out.println("Zahl " + j + " =" + numbers[j]);
		}
		System.out.println("");
		System.out.println("Ausgabe der Zufallszahlen in sortierter Form:");
		System.out.println(ausgabe);
		System.out.println("");
		System.out.println("Ausgabe der gesuchten Zahl:");
		System.out.println(search());
		
		System.out.println("");
		
		return i;
		
	
	}

	}
 
hei, muss denn search ueberhaupt was zurueckgeben? mach doch statt int einfach void und nimm das return 1 wech...schon hat sich das erledigt. oder du gibst ein boolean zurueck, was true ist, wenn was gefunden wurde und false, wenn nicht. dann koenntest du eine abfage in der art machen:

Code:
if(search(5)){
    //was gefunden
}else{
    //nix gefunden
}

nur sone idee 🙂. also debugger gibts ja nu viele...welchen sollt ihr denn verwenden?

gruesse
 
als debugger sollen wir den con eclipse nehmen. wenn ich das in void abändern, klappt das irgendwie nicht in der Ausgabe. Hat da einen fehler bei println
 
sorry, da muss ich passen...such doch mal bei google nach eclipse debugger oder so? ich denke mal, ienfach breakpoints setzen und so weiter.

gruesse
 
mmh, hast du noch ne idee wie das mit der search methode ist. klappt bei mir leider immer noch net
 
also wenn Du die Funktion search auf void änderst, mußt Du in der Funktion Ausgabe folgendes ändern:
aus:
Code:
System.out.println(search());
wird:
Code:
search();

mfg
DocRandom
 
Code:
import java.util.*;
public class Tut2 {
   final static BitSet number =new BitSet();
   final static int[] numbers   = new int [10];
   static int i = 0;
   
   static String ausgabe = "";
   
   public static void main (String []args){
      zahlen();
      sort();
      //search();
      Ausgabe();
   }
   /*
    * Zufallszahlen generieren
    */
   public static int zahlen(){
               
      Random randomizer1 = new Random();
         
      while (i < 10){
         numbers[i] = (byte)(1 + (Math.abs(randomizer1.nextInt())%49));
         if (!number.get(numbers[i])){
            number.set(numbers[i]);
            i++;
         }
      }
      
      return i;
   }
   /*
    * vorher generierte Zufallszahlen in sortiereter Form ausgebene
    */
   public static int sort(){
      java.util.Arrays.sort(numbers);
       
       
      for(int name : numbers)
           ausgabe += name + "\n";
      
      //System.out.println(ausgabe);
      return i;
   }
   
   /*
    * Suche einer Zahl in der Zahlenfolge
    */
   public static void search(){
      for(int i=0; i<numbers.length; i++){
           int numberToSearchFor = 5;
         if(numbers[i]==numberToSearchFor){
              System.out.println("Zahl ist enthalten"); //drinnen
           }else{
              System.out.println("Zahl ist leider nicht enthalten"); //nicht drinnen
           }
         
      }
   }
   
   public static int Ausgabe(){
      
      System.out.println("Ausgabe der Zufallszahlen");
      for (int j =0; j < numbers.length; j++){
         System.out.println("Zahl " + j + " =" + numbers[j]);
      }
      System.out.println("");
      System.out.println("Ausgabe der Zufallszahlen in sortierter Form:");
      System.out.println(ausgabe);
      System.out.println("");
      System.out.println("Ausgabe der gesuchten Zahl:");
      search();
      
      System.out.println("");
      
      return i;
      
   
   }
}

mfg
DocRandom
 
hi, geht doch!? was genau geht denn bei dir nicht? warum hast du alle felder static? eigentlich sollte man die private anlegen und evtl. ueber setter und getter verfuegbar machen.

gruesse
 
eine frage. Um welche methoden des suchens und des sortierens handelt es sich denn in diesem Prog?
 
wie kann man denn jetzt mal zu testzwecken (für den debugger) einen indexüberlauf erzeugen, oder vielleicht nen anderen brauchbaren fehler? ich weiss hört sich komisch an, aber wir sollen uns mal in den debugger einarbeiten.
 
fuer den debugger? na ja, du koenntest einfach ein array mit 10 elementen erzeugen und dann ne schleife von 1-20 oer so durchlaufen und bei jedem durchlauf auf das array zugreifen. oder du dividierst durch 0. das faellt mir jetzt so spontan ein 🙂

gruesse
 
kann mir mal jemand schnll helfen. die wollen jetzt aufeinmal ein sortieralgorithmus wie Insertion Sort reinhaben. Der klappt bei mir allerdings net. Seht ihr wo der Fehler liegt?

Code:
package Tut2;



import java.util.BitSet;
import java.util.Random;

public class Tut231 { 
    final static BitSet number =new BitSet(); 
    static int[] numbers   = new int [10]; //gibt die Größe des Arrays an
    static int i = 0; 
    static String ausgabe = ""; 
    
    public static void main(String []args){ 
        //zahlen(); 
        //sort(); 
        //search();
        ausgabe();
    } 
    
    /* 
     * Zufallszahlen generieren 
     */ 
    public static void zahlen(){ 
        
        Random randomizer1 = new Random(); 
        
        while (i < 10){ 
            numbers[i] = (byte)(1 + (Math.abs(randomizer1.nextInt())%49)); 
            if (!number.get(numbers[i])){ 
                number.set(numbers[i]); 
                i++; 
            } 
        } 
        for (int j =0; j < numbers.length; j++){ 
            System.out.println("Zahl " + j + " =" + numbers[j]); 
            
        } 
         
    } 
    
    /* 
     * vorher generierte Zufallszahlen in sortiereter Form ausgebene 
     */ 
    public static void sort(){ 
        java.util.Arrays.sort(numbers); //sortiert den Inhalt von numbers
        
        for(int name : numbers) 
            ausgabe += name + "\n"; 
        System.out.println(ausgabe);
         
         
    } 
        
    public static void Insertion(){ 
        for (int j=1;j<=numbers.length;j++){ 
            if (numbers[j]<numbers[j-1]){ 
                int temp=numbers[j]; 
                int i=j; 
                do{ 
                    i--; 
                    numbers[i+1]=numbers[i]; 
                }while((i>=1)||(numbers[i-1]<=temp)); 
                numbers[i]=temp; 
            } 
        }        
     } 
    
    /* 
     * Suche einer Zahl in der Zahlenfolge 
     */ 
    public static void search(){ 
        for(int i=0; i<numbers.length; i++){ 
             int numberToSearchFor = 5; 
           if(numbers[i]==numberToSearchFor){ 
                System.out.println("Die Zahl " + numberToSearchFor + " ist hier enthalten"); //drinnen 
             }else{ 
                System.out.println("Die Zahl " + numberToSearchFor + " ist hier leider nicht enthalten"); //nicht drinnen 
             } 
            
        } 
     } 
    
    /*
     * Ausgabe der der methode zahlen, sort, search
     */
    public static int ausgabe(){
    	System.out.println("Ausgabe der Zufallszahlen:");
    	zahlen();
    	
    	System.out.println("");
    	System.out.println("Ausgabe der Zufallszahlen in sortierteer Form:");
    	sort();
    	
    	System.out.println("");
    	System.out.println("Ausgabe der Zufallszahlen in sortierteer Form(Bubble sort):");
    	Insertion();
    	
    	System.out.println("");
    	System.out.println("Ausgabe, ob eine gesuchten Zufallszahl vorhanden ist: ");
    	search();
    	 
        
        return i; 
    }
    
}
 
zb:

Code:
public class InsertionSort {
    static long comparisons = 0;
    static long exchanges   = 0;

    public static void insertionSort(double[] a) {
        int N = a.length;
        for (int i = 0; i < N; i++)
            for (int j = i; j > 0; j--)
                if (less(a[j], a[j-1]))
                    exch(a, j, j-1);
                else break;
    }

    // is x < y?
    private static boolean less(double x, double y) {
        comparisons++;
        return (x < y);
    }

    // exchange a[i] and a[j]
    private static void exch(double[] a, int i, int j) {
        exchanges++;
        double swap = a[i];
        a[i] = a[j];
        a[j] = swap;
    }



    // generate N real numbers between 0 and 1, and insertion sort them
    public static void main(String[] args) {
        int N = Integer.parseInt(args[0]);
        double[] a = new double[N];
        long start, stop;
        double elapsed;


        // read first N strings from stdin
        start = System.currentTimeMillis(); 
        for (int i = 0; i < N; i++)
            a[i] = Math.random();
        stop = System.currentTimeMillis();
        elapsed = (stop - start) / 1000.0;
        System.out.println("Generating input:  " + elapsed + " seconds");

        // sort them
        start = System.currentTimeMillis(); 
        insertionSort(a);
        stop = System.currentTimeMillis();
        elapsed = (stop - start) / 1000.0;
        System.out.println("Insertion sort: " + elapsed + " seconds");
        System.out.println("Comparisons: " + comparisons);
        System.out.println("Exchanges:   " + exchanges);
    }
}

gruesse
 
Kann mir vielleicht nochmal helfen. BEkomme das mit dem InsertionSort nicht so wirklich hin.

Code:
import java.util.BitSet;
import java.util.Random;

public class tut2 { 
    final static BitSet number =new BitSet(); 
    static int[] numbers   = new int [10]; 
    static int i = 0; 
    static String ausgabe = ""; 
    static long comparisons = 0; 
    static long exchanges   = 0;
    
    public static void main(String []args){ 
        //zahlen(); 
        //sort(); 
        //search();
        //ausgabe();
        
        
        
        int N = Integer.parseInt(args[0]); 
        double[] numbers = new double[10]; 
        long start, stop; 
        double elapsed; 


        // read first N strings from stdin 
        start = System.currentTimeMillis(); 
        for (int i = 0; i < 10; i++) 
            numbers[i] = Math.random(); 
        stop = System.currentTimeMillis(); 
        elapsed = (stop - start) / 1000.0; 
        System.out.println("Generating input:  " + elapsed + " seconds"); 

        // sort them 
        start = System.currentTimeMillis(); 
        insertionSort(numbers); 
        stop = System.currentTimeMillis(); 
        elapsed = (stop - start) / 1000.0; 
        System.out.println("Insertion sort: " + elapsed + " seconds"); 
        System.out.println("Comparisons: " + comparisons); 
        System.out.println("Exchanges:   " + exchanges);
    } 
    
    /* 
     * Zufallszahlen generieren 
     */ 
    public static void zahlen(){ 
        
        Random randomizer1 = new Random(); 
        
        while (i < 10){ 
            numbers[i] = (byte)(1 + (Math.abs(randomizer1.nextInt())%49)); 
            if (!number.get(numbers[i])){ 
                number.set(numbers[i]); 
                i++; 
            } 
        } 
        for (int j =0; j < numbers.length; j++){ 
            System.out.println("Zahl " + j + " =" + numbers[j]); 
            
        } 
         
    } 
    
    /* 
     * vorher generierte Zufallszahlen in sortiereter Form ausgebene 
     */ 
    public static void sort(){ 
        java.util.Arrays.sort(numbers); 
        
        for(int name : numbers) 
            ausgabe += name + "\n"; 
        System.out.println(ausgabe);
         
         
    } 
    
    /*
     * InsertionSort
     */
    public static void insertionSort(double[] a) { 
        int N = a.length; 
        for (int i = 0; i < N; i++) 
            for (int j = i; j > 0; j--) 
                if (less(a[j], a[j-1])) 
                    exch(a, j, j-1); 
                else break; 
    } 
   
    //  is x < y? 
    private static boolean less(double x, double y) { 
        comparisons++; 
        return (x < y); 
    } 
    
    //  exchange a[i] and a[j] 
    private static void exch(double[] a, int i, int j) { 
        exchanges++; 
        double swap = a[i]; 
        a[i] = a[j]; 
        a[j] = swap; 
    } 
    
    
    
    
    
    
   
    /* 
     * Suche einer Zahl in der Zahlenfolge 
     */ 
    public static void search(){ 
        for(int i=0; i<numbers.length; i++){ 
             int numberToSearchFor = 5; 
           if(numbers[i]==numberToSearchFor){ 
                System.out.println("Die Zahl " + numberToSearchFor + " ist hier enthalten"); //drinnen 
             }else{ 
                System.out.println("Die Zahl " + numberToSearchFor + " ist hier leider nicht enthalten"); //nicht drinnen 
             } 
            
        } 
     } 
    
    /*
     * Ausgabe der der methode zahlen, sort, search
     */
    public static int ausgabe(){
    	System.out.println("Ausgabe der Zufallszahlen:");
    	zahlen();
    	
    	System.out.println("");
    	System.out.println("Ausgabe der Zufallszahlen in sortierteer Form:");
    	sort();
    	
    	System.out.println("");
    	System.out.println("Ausgabe einer gesuchten Zufallszahl: ");
    	search();
    	 
        
        return i; 
    }
    
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben