Array kopieren und nur bestimmte Werte speichern

CeliB

Mitglied
Hallo liebe Community,

ich habe ein Problem mit einem Einsendeaufgabe meines Fernstudiums. Ich bin gerade bei Arrays und ich soll ein eindimensionales Array erzeugen durch die Eingabe von Zahlen in die Konsole. So funktioniert das auch jedoch soll eine untere und eine obere Grenze geben und nur die Zahlen innerhalb der Grenzen sollen ausgegeben werden. Und hier ist mein Problem. Wie bekomme ich es hin, die Zahlen innerhalb der Grenze in ein neues Array zu speichern, auf dem ich dann weitere Methoden anwenden kann, wie sortieren, kleinster Wert, größter Wert usw.
Wie funktioniert das? Ich habe das Forum schon durchsucht und beiße mir langsam die Zähne daran aus. Kann mir jemand helfen?

Hier ist die momentane Ausgabe:

Bitte geben Sie ein Zahl zwischen -5 und 5 ein (0 beendet das Programm): 4
Bitte geben Sie ein Zahl zwischen -5 und 5 ein (0 beendet das Programm): 5
Bitte geben Sie ein Zahl zwischen -5 und 5 ein (0 beendet das Programm): 1
Bitte geben Sie ein Zahl zwischen -5 und 5 ein (0 beendet das Programm): -10
Bitte geben Sie ein Zahl zwischen -5 und 5 ein (0 beendet das Programm): 9
Bitte geben Sie ein Zahl zwischen -5 und 5 ein (0 beendet das Programm): 2
Bitte geben Sie ein Zahl zwischen -5 und 5 ein (0 beendet das Programm): 0

Zahlen der Reihung: [4, 5, 1, -10, 9, 2, 0, 0, 0, 0]
Sortierte Reihung: [4, 5, 1, -10, 9, 2, 0, 0, 0, 0]
Obere erlaubte Grenze: 5
Untere erlaubte Grenze:-5
Korrekte Eingaben: 4
Falsche Eingaben: 2
Der kleinste Wert der Reihung: -10
Der größte Wert der Reihung: 9
Die Summe der Zahlen aus der Reihung: 11

Und so sollte sie aussehen:

Zahlen der Reihung: [4, 5, 1, 2]
Sortierte Reihung: [1, 2, 4, 5]
Obere erlaubte Grenze: 5
Untere erlaubte Grenze:-5
Korrekte Eingaben: 4
Falsche Eingaben: 2
Der kleinste Wert der Reihung: 1
Der größte Wert der Reihung: 5
Die Summe der Zahlen aus der Reihung: 12




Java:
import java.util.Arrays;
public class Reihung {

	
	
	
	int anzKorrekt;
	int anzFalsch;
	int summe = 0;
	int min = 0;
	int max = 0;
	int temp = 0;
	int maxAnzahl = 10;
	int untereGrenze = -5;
	int obereGrenze = 5;
	
	int[]reihung = new int[maxAnzahl];
	
	
	/** Konstruktor fuer eine Reihung
	 * 
	 * @param maxAnzahl
	 * 		Die Laenge der Reihung wird hier gespeichert.
	 * @param untereGrenze
	 * 		Die untere Grenze der erlaubten einzugebenden Zahlen.
	 * @param obereGrenze
	 * 		Die obere Grenze der erlaubeten einzugebenden Zahlen.
	 */
	
	public Reihung(int maxAnzahl, int untereGrenze, int obereGrenze){
	 
		
	}

	public Reihung(int[] reihung){
		
	}
	
	/**
	 * Methode zum einlesen der Werte fuer die Reihung.
	 * 
	 */
	
	public void einlesen() {
		
		for(int i = 0; i < reihung.length; i++ ){
		 reihung[i] = Konsole.getInputInt("Bitte geben Sie ein Zahl zwischen -5 und 5 ein (0 beendet das Programm): ");
		       if(reihung[i] == 0){
		    	   break;
		       }else if((reihung[i] >= untereGrenze) && (reihung[i] <= obereGrenze)){
					anzKorrekt++;
		       } else {
		    	   anzFalsch++;
		       }
		}
						
		
	}
	
		
	
	
		public int getMin() {
				
			int minIndex = 0;
			
			for(int i = 1; i < reihung.length; i++){
				if(reihung[i] < reihung[minIndex]){
					minIndex = i;
						}
			}
			
				min = reihung[minIndex];
		
	
		  return min;
		}					
		
					
					

			public int getMax() {		
				
				int maxIndex = reihung.length-1;
				
				for(int i = 0; i < reihung.length; i++){
					if(reihung[i] > reihung[maxIndex])
						maxIndex = i;
				}		
				
						max = reihung[maxIndex];
						
				return max;
				
			}

				public int berechneSumme() {
					for(int i = 0; i < reihung.length; i++){
						summe += reihung[i];
					
				}
					return summe;
}
				
				public int[] sortiereReihung(){
					
					int temp;
					for (int i = 1; i < reihung.length; i++) {
						for(int j = 0; j < reihung.length-i; j++ ) {
							if(reihung[i]>reihung[j+1]) {
								temp = reihung[i];
								reihung[i+1] = temp;
							}
						
						}
						
					}
					
			
					return reihung;
				}
				
				
					
				
				
				
				public String toString(){
				
					
				return "\nZahlen der Reihung: " + Arrays.toString(reihung) + "\nSortierte Reihung: " + Arrays.toString(reihung) + "\nObere erlaubete Grenze: " + obereGrenze + "\nUntere erlaubte Grenze:" +
						untereGrenze + "\nKorrekte Eingaben: " + anzKorrekt + "\nFalsche Eingaben: " + anzFalsch;
				
				}
				
}

Testklasse:

Java:
public class ReihungTest {

	public static void main(String[] args) {

		Reihung arr = new Reihung(0,0,0);
		arr.einlesen();
		System.out.println(arr.toString());
		System.out.println("Der kleinste Wert der Reihung: " + arr.getMin());
		System.out.println("Der größte Wert der Reihung: " + arr.getMax());
		System.out.println("Die Summe der Zahlen aus der Reihung: " + arr.berechneSumme());
               }
}

Danke und Gruß
Celi
 
Sollen denn alle Zahlen unabhängig der Grenze überhaupt gespeichert werden? Sonst würde ich einfach nur die Zahlen in das array speichern, die innerhalb der Grenze liegen. Wäre das einfachste.. Ansonsten erstelle halt ein neues array in der grösse der korrekten Eingaben, gehe mit einer for schleife durch das erste array und speichere die richtigen Einträge in das neue.
Edit: Ok grade gesehen du hast ja die festgelegte Abfragenwiederholung, insofern doch Option b.
 
Zuletzt bearbeitet:
Hallo franky27, schon mal vielen Dank für deine Antwort.
Dass ich ein neues Array erstellen muss hatte ich mir schon gedacht nur bekomme ich es einfach nicht hin. Wie mache ich das? Oder wie kann ich nur die "richtigen" Werte schon im ersten Array speichern?
Gruß Celi
 
Hey, hab dein Programm mal kurz überflogen.
Guck dir mal deine toString-Methode an, die kann garkeine sortierte Liste ausgeben, weil du deine sortiereReihung()-methode vorher garnicht ausgeführt aus.

Ich glaube auch, dass die Sortierung nicht richtig funktioniert mit deiner Funktion. Das sieht nach einem Bubble-Sort-Versuch aus, aber die Indizes und Vertauschungen passen nicht ganz, wenn ich das richtig sehe.

Nur gültige Zahlen einlesen würde zB so gehen:
Java:
public void einlesen() {
		int eingabe;
		int i = 0;
		Scanner sc = new Scanner(System.in);
		do{			
			System.out.println("Bitte geben Sie die "+ (i+1) +". Zahl zwischen -5 und 5 ein (0 beendet das Programm)");
			eingabe = sc.nextInt();
			if(eingabe <= 5 && eingabe >= (-5)){
				reihung[i]=eingabe;
				i++;
			}else{
				System.out.println("Ungültige Eingabe");
			}
		}while(eingabe != 0 && i<maxAnzahl);
 
 
	}
 
Zuletzt bearbeitet:
Naja deklarier dir ein array in der Klasse, zB
Java:
int []korrekteWerte;
Dann mach dir noch eine Methode addKorrekteWerte(). In der initialisierst du das neue Array in der grösse deiner anzKorrekt variable
Java:
korrekteWerte = new int[anzKorrekt];
Dann gehst du in einer for scheife dein erstes array durch und speicherst den jeweiligen Wert darin, sofern er richtig ist, in deinem neuem Array:
Java:
int j = 0;
	for (int i = 0 ; i<erstesArray.length; i++){
		if (alleZahlen[i]) *deine Bedingungen*){
			korrekt[j]=alleZahlen[i];
			j++;
                }
Kannst dir ja zB noch eine Methode für die Bedingungen bauen, wo du deine Grenzen abfagst
Java:
private boolean isCorrect(int zahl)
und true zurückgibst wenn die Zahl ok ist. Dann kannst du sowohl verwenden bei der Eingabe um anzKorrekt hochzuzählen, als auch in der addKorrekteWerte Methode.
 
Edit: in der for Schleife muss das alleZahlen[] natürlich erstesArray heissen und das andere eben korrekteWerte ...
 
Zuletzt bearbeitet:
Hallo Zusammen,

vielen Dank für Eure Hilfe. Jetzt funktioniert die Ausgabe so, wie ich sie brauche.
@Tarrew ich weiß, die Sortierung funktioniert nicht, weil ich die Methode gar nicht aufrufe, ich wollte erstmal das erste Problem behoben wissen. Danke für den Hinweis.
Ich habe außerdem das Array kopiert, damit nur die (richtigen) Zahlen ausgegeben werden.

Java:
public void einlesen() {
		int eingabe;
		int i = 0;
		
		do {
			eingabe = Konsole.getInputInt("Bitte geben Sie ein Zahl zwischen -5 und 5 ein (0 beendet das Programm): ");
					if (eingabe <= obereGrenze && eingabe >= untereGrenze) {
						reihung[i] = eingabe;
						i++;
						anzKorrekt++;
					} else {
						anzFalsch++;
						
					}
					
		}
		
		while(eingabe !=0 && i < maxAnzahl);
		
		reihung2 = new int[anzKorrekt];
		System.arraycopy(reihung, 0, reihung2, 0, anzKorrekt);
		
	}

An der Sortierung versuche ich mal alleine.

Vielen Dank für Eure Hilfe und lieben Gruß
Celi
 

Zurück
Oben