N
NeedHelp
Gast
Hallo,
ich sitze nun seit mehreren Stunden an ein und dem selben Programm. Ziel meiner Aufgabe ist es ein Set mit Zufallswerten zu füllen und anschließend iterativ sowie rekursiv den zweithöchsten wert des Sets wieder auszugeben.
Aktuell habe ich folgendes zusammengeschnipselt:
[Java]import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Second {
public static void main(String[] args) {
int x;
Set<Comparable> set = new HashSet<Comparable>();
for(int i = 0; i < 4; i++){
x = (int)(Math.random()*100);
set.add(x);
System.out.print(x + " ");
}
System.out.println("");
System.out.println("SecondbestLoop: " + secondbestLoop(set));
System.out.println("");
System.out.println("SecondbestRecursive: " + secondbestRec(set));
}
public static int secondbestLoop(Set<Comparable> bla){
int now;
int highest= 0;
int second = 0;
Iterator i = bla.iterator();
while(i.hasNext()){
now = (Integer) i.next();
if(now > highest){
second = highest;
highest = now;
}
else if(now > second){
second = now;
}
}
return second;
}
public static int secondbestRec(Set<Comparable> s){
int high = 0;
int sec = 0;
int[] ar = {high, sec};
s.add(0);
return secondbestRec(s, ar);
}
public static int secondbestRec(Set<Comparable> s, int[] ar){
Iterator i = s.iterator();
int now = (Integer) i.next();// now = der aktuelle wert
if(!i.hasNext()){ // wenn i keinen next mehr hat
return ar[1]; // return second
}
if(now > ar[0]){ // wenn der aktuelle wert größer ist als highest
s.remove(ar[1]); //entferne den zweithöchsten wert aus s
ar[1] = ar[0]; // setze second = der bisher höchste wert
ar[0] = now; // highest = der aktuelle wert
return secondbestRec(s, ar);
}
if(now > ar[1]){ // wenn der atkuelle wert größer ist als der zweithöchste
s.remove(ar[1]); // dann entferne den zweithöchsten aus s
ar[1] = now; // second ist jetzt der aktuelle wert
return secondbestRec(s, ar);
}
else{
s.remove(now); //ansonsten entferne den aktuellen wert
return secondbestRec(s, ar);
}
}
}[/code]
Der iterative Aufruf funktioniert. Beim rekursiven Aufruf wird mir immer der höchste Wert ausgegeben.
Nach mehrmaligem debuggen denke ich das der Fehler der iterator ist. Meinem "now" wird immer der gleiche Wert zugewiesen. Sehe ich das richtig und wie könnte ich das Problem lösen? Ich möchte betonen dass ich wirklich nur konstruktive Kritik gebrauchen kann und das dies definitiv keine Hausaufgabe sondern eine freiwillige Übungsaufgabe einer ehemaligen Prüfungsaufgabe ist, für die leider keine Lösungen existieren.
Vielen Dank an alle die, die sich die Mühe machen.
ich sitze nun seit mehreren Stunden an ein und dem selben Programm. Ziel meiner Aufgabe ist es ein Set mit Zufallswerten zu füllen und anschließend iterativ sowie rekursiv den zweithöchsten wert des Sets wieder auszugeben.
Aktuell habe ich folgendes zusammengeschnipselt:
[Java]import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Second {
public static void main(String[] args) {
int x;
Set<Comparable> set = new HashSet<Comparable>();
for(int i = 0; i < 4; i++){
x = (int)(Math.random()*100);
set.add(x);
System.out.print(x + " ");
}
System.out.println("");
System.out.println("SecondbestLoop: " + secondbestLoop(set));
System.out.println("");
System.out.println("SecondbestRecursive: " + secondbestRec(set));
}
public static int secondbestLoop(Set<Comparable> bla){
int now;
int highest= 0;
int second = 0;
Iterator i = bla.iterator();
while(i.hasNext()){
now = (Integer) i.next();
if(now > highest){
second = highest;
highest = now;
}
else if(now > second){
second = now;
}
}
return second;
}
public static int secondbestRec(Set<Comparable> s){
int high = 0;
int sec = 0;
int[] ar = {high, sec};
s.add(0);
return secondbestRec(s, ar);
}
public static int secondbestRec(Set<Comparable> s, int[] ar){
Iterator i = s.iterator();
int now = (Integer) i.next();// now = der aktuelle wert
if(!i.hasNext()){ // wenn i keinen next mehr hat
return ar[1]; // return second
}
if(now > ar[0]){ // wenn der aktuelle wert größer ist als highest
s.remove(ar[1]); //entferne den zweithöchsten wert aus s
ar[1] = ar[0]; // setze second = der bisher höchste wert
ar[0] = now; // highest = der aktuelle wert
return secondbestRec(s, ar);
}
if(now > ar[1]){ // wenn der atkuelle wert größer ist als der zweithöchste
s.remove(ar[1]); // dann entferne den zweithöchsten aus s
ar[1] = now; // second ist jetzt der aktuelle wert
return secondbestRec(s, ar);
}
else{
s.remove(now); //ansonsten entferne den aktuellen wert
return secondbestRec(s, ar);
}
}
}[/code]
Der iterative Aufruf funktioniert. Beim rekursiven Aufruf wird mir immer der höchste Wert ausgegeben.
Nach mehrmaligem debuggen denke ich das der Fehler der iterator ist. Meinem "now" wird immer der gleiche Wert zugewiesen. Sehe ich das richtig und wie könnte ich das Problem lösen? Ich möchte betonen dass ich wirklich nur konstruktive Kritik gebrauchen kann und das dies definitiv keine Hausaufgabe sondern eine freiwillige Übungsaufgabe einer ehemaligen Prüfungsaufgabe ist, für die leider keine Lösungen existieren.
Vielen Dank an alle die, die sich die Mühe machen.