package Testate.Stream;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Ort implements Comparable<Ort> {
	
	 String name;
	 int postleitzahl;
	 double länge;
	 double breite;

	public Ort(String name, int postleitzahl, double länge, double breite) {
		this.name = name;
		this.postleitzahl = postleitzahl;
		this.länge = länge;
		this.breite = breite;
	}
	
	

	public String getName() {
		return name;
	}



	public void setName(String name) {
		this.name = name;
	}



	public int getPostleitzahl() {
		return postleitzahl;
	}



	public void setPostleitzahl(int postleitzahl) {
		this.postleitzahl = postleitzahl;
	}



	public double getLänge() {
		return länge;
	}



	public void setLänge(double länge) {
		this.länge = länge;
	}



	public double getBreite() {
		return breite;
	}



	public void setBreite(double breite) {
		this.breite = breite;
	}



	@Override
	public String toString() {
		return "Ort [name=" + name + ", postleitzahl=" + postleitzahl + ", länge=" + länge + ", breite=" + breite + "]";
	}


	@Override
	public int compareTo(Ort o) {
		return Integer.compare(o.postleitzahl, this.postleitzahl);
	}

	public static void main(String[] args) {
		 Ort[] orte2 = new Ort[5];
		 orte2[1] = new Ort("Hamburg", 20095, 9.9937,0);
        orte2[0] = new Ort("Berlin", 10115, 13.405, 52.52);
        
        orte2[2] = new Ort("München", 80331, 11.5755, 10);
        orte2[3] = new Ort("Köln", 50667, 6.9603, 50.9375);				
        orte2[4] = new Ort("Frankfurt", 60311, 8.6821, 50.1109);
        
       
        bubbleSort(orte2);
        for (Ort o : orte2)
        	System.out.println(o.toString());
	}
	
	public static void bubbleSort(Ort[] orte) {
		
		for (int i = 0 ; i < orte.length-1; i++)
			for(int j = 0; j < orte.length -1; j++)
				if (orte[j].compareTo(orte[j+1]) > 0) {
					Ort tem = orte[j];
					orte[j] = orte[j+1];
					orte[j+1] = tem;
				}
	}
	
	public static void insertionSort(Ort[] orte) {
        int n = orte.length;

        for (int i = 1; i < n; i++) {
        	Ort key = orte[i];
            int j = i - 1;

            // Verschiebe Elemente, die größer als der Schlüssel sind, um Platz zu schaffen
            while (j >= 0 && orte[j].postleitzahl < key.postleitzahl) {
            	orte[j + 1] = orte[j];
                j--;
            }

            // Setze den Schlüssel an die richtige Stelle
            orte[j + 1] = key;
        }
    }

	
	public static LinkedList<Ort> findOrte(Ort[] orte) {
		Stream<Ort> st = Stream.of(orte);

		LinkedList<Ort> treffer = st.parallel().filter(o -> o.getBreite() > 0)
				.collect(Collectors.toCollection(LinkedList::new));

		return treffer;
	}
	
	public static void sort(Ort[] orte) {
		
		for (int i = 0; i < orte.length; i++) {
			int merker = i;
			
			for (int j = i + 1; j < orte.length; j++)
				if (orte[j].compareTo(orte[merker]) < 0)
					merker = j;
			
			Ort tem = orte[merker];
			orte[merker] = orte[i];
			orte[i] = tem;
		}
	}
	
	public static void sortComparator(Ort[] orte, Comparator<Ort> sort) {
		sort = new SortOrte();
		for (int i = 0; i < orte.length; i++) {
			int merker = i;

			for (int j = i + 1; j < orte.length; j++)
				if (sort.compare(orte[j], orte[merker]) > 0)
					merker = j;

			Ort tem = orte[merker];
			orte[merker] = orte[i];
			orte[i] = tem;
		}
	}

}

class SortOrte implements Comparator<Ort>{
	
	@Override
	public int compare(Ort o1, Ort o2) {
		return o2.name.compareTo(o1.name);
	}
}




