28 Variablen vergleichen und die höchsten addieren

Status
Nicht offen für weitere Antworten.

Janny

Mitglied
Ich weiß jetzt nicht, ob das hier das richtige Forum dafür ist, aber wenn es das falsche ist, kann es ja ein Mod verschieben.

Ich habe folgendes Problem: Ich habe 28 Variablen und möchte diese miteinander vergleichen, dabei sollten die n höchsten Variablen addiert werden und noch in einem String s gespeichert werden, welche Variablen addiert wurden. Das ganze könnte man mit einer While-Schleife lösen, die n-mal durchläuft und bei jedem Durchlauf mittels if-Abfrage die höchste Variable ermittelt. Die höchste Variable wird dann addiert, der Name in s geschrieben und gleich null gesetzt, so dass sie beim nächsten Durchlauf nicht nochmal addiert wird. Allerdings müsste man da 28 If-Abfragen ineinander verschachteln. Da gibt es doch sicher eine elegantere Lösung oder ?
 

Mag1c

Top Contributor
Hi,

welcher Datentyp ? Pack alle Werte in ein Array, sortiere das Array und addiere dann n Elemente vom Ende aus gesehen.

Gruß
Mag1c
 

Janny

Mitglied
Sind alles Integerzahlen von 0-15. Falls ich das aber mit einem Array mache, dann weiß ich nach nicht, welche Variablen addiert wurden.
 

AlArenal

Top Contributor
Dann musst du dir eben ein Objekt basteln, dem du als Property nen Namen und nen int-Wert zuweisen kannst. Die Instanzen packst du in eine List, sortierst das ganze mittels Collections.sort(...) über einen eigenen Comparator - fertig :)
 

Mag1c

Top Contributor
oder:

Code:
private class MyComparator implements Comparator {
    public int compare (Object o1, Object o2) {
        return ((Integer)((Object[]) o1)[0]).compareTo((Integer)((Object[]) o2)[0]);
    }
}

...

    int var1 = 10;
    int var2 = 1;
    int var3 = 5;
    Object[][] arr = new Object[][] { {new Integer(var1), "var1"},
                                              {new Integer(var2), "var2"},
                                              {new Integer(var3), "var3"}
    };
    Arrays.sort(arr, new MyComparator());
    for (int i=arr.length-1; i >= 0; i--) {
        System.out.println(i+". "+arr[i][1]+" = "+arr[i][0]);
    }

Gruß
Mag1c
 

Janny

Mitglied
@Mag1c
Hmm, ich blicke bei deinem Code nicht so ganz durch, könntest du den vielleicht mal ein bisschen erläutern. Danke !
 

Janny

Mitglied
Wo muss ich denn dann eigentlich die private Klasse hinpacken ? So geht das net:

Code:
import java.awt.*;
import java.awt.event.*;


public class FenApp extends Frame {

        public FenApp() {
        
                super( "Java-Fenster-Applikation" );
                setSize( 500, 400 );
                setVisible( true );
                
                int var1 = 10;
                int var2 = 1;
                int var3 = 5;
                Object[][] arr = new Object[][] { {new Integer( var1 ), "var1"},
                                                  {new Integer( var2 ), "var2"},
                                                  {new Integer( var3 ), "var3"}
                                                };
                Arrays.sort( arr, new MyComparator() );
                
                for ( int i = arr.length - 1; i >= 0; i-- ) {
                        System.out.println( i + ". " + arr[ i ][ 1 ] + " = " + arr[ i ][ 0 ] );
                        }
                        
                label l = new Label ( i );
                }
                
        class FensterLauscher
                extends WindowAdapter {
                public void windowClosing( WindowEvent e ) {
                        System.exit( 0 );
                        }
                }
                
       public static void main( String[] args ) {
                new FenApp();
                }
        }


private class MyComparator implements Comparator {
        public int compare ( Object o1, Object o2 ) {
                return ( ( Integer ) ( ( Object[] ) o1 ) [ 0 ] ).compareTo( ( Integer ) ( ( Object[] ) o2 ) [ 0 ] );
                }
        }

Tut mir leid für die dummen Fragen, aber ich kenn mich noch nicht so gut mit Java aus. :oops:
 

Mag1c

Top Contributor
Moin,

eine private Klasse kommt in den class-Block aber außerhalb der Methoden.

In meinem Code benutze ich ein zweidimensionales Object-Array, wo ich in der ersten Spalte den int-Wert (als Integer-Objekt) und in der zweiten Spalte den Namen der Variablen ablege:

Code:
 |Integer|String
------------------
0 |  10   |"var1"
1 |   1   |"var2"
2 |   5   |"var3"

Nun sortiere ich mit dem Arrays.sort(...), was normalerweise nur eindimensionale Arrays sortieren kann. Mit dem selbst gebastelten Comparator kommt sie aber auch mit diesem Array zurecht. Ich erhalte ein sortiertes Array und kann in der zweiten Spalte auf den originalen Variablennamen zurückgreifen.

Letztendlich läuft das auf eine ähnliche Lösung hinaus, wie AlArenal vorgeschlagen hat. Meine Variante ist komplizierter zu lesen spart aber eine zusätzliche Klasse ein.

Gruß
Mag1c
 

Janny

Mitglied
Hmm, ich hab das jetzt mal umgesetzt aber den Compiler stört immer noch die private Klasse und der Befehl Array.sort....

Was ist denn noch falsch ?

Code:
import java.awt.*;
import java.awt.event.*;


public class FenApp extends Frame implements ActionListener{
	
	        TextArea ausgabe= new TextArea ( " ",6,6);
		Button b = new Button ("los !");
	
	private class MyComparator implements Comparator {
        public int compare ( Object o1, Object o2 ) {
                return ( ( Integer ) ( ( Object[] ) o1 ) [ 0 ] ).compareTo( ( Integer ) ( ( Object[] ) o2 ) [ 0 ] );
                }
        } 

        public FenApp() {
        
                super( "Java-Fenster-Applikation" );
                setSize( 500, 400 );
                setVisible( true );
                

		b.addActionListener(this);
		
		add(b);
		add(ausgabe);
		
		
                }
		
		public void actionPerformed (ActionEvent e) {
			int var1 = 10;
                int var2 = 1;
                int var3 = 5;
                Object[][] arr = new Object[][] { {new Integer( var1 ), "var1"},
                                                  {new Integer( var2 ), "var2"},
                                                  {new Integer( var3 ), "var3"}
                                                };
                Arrays.sort( arr, new MyComparator() );
                
                for ( int i = arr.length - 1; i >= 0; i-- ) {
                        System.out.println( i + ". " + arr[ i ][ 1 ] + " = " + arr[ i ][ 0 ] );
                        
			String aus = Integer.toString(i);
			ausgabe.setText(aus);
		}
		}
                
        class FensterLauscher extends WindowAdapter {
                public void windowClosing( WindowEvent e ) {
                        System.exit( 0 );
                        }
                }
		

		
                
       public static void main( String[] args ) {
                new FenApp();
                }
        }
 

Bleiglanz

Gesperrter Benutzer
warum nicht eine TreeMap<Integer,String> verwenden??

Code:
    public static void main(String[] args) {
        Random rnd = new Random();
        TreeMap<Integer,String> liste = new TreeMap<Integer,String>();
        for(int i=0;i<28;i++){
            liste.put(Integer.valueOf(rnd.nextInt(10000)),"var"+i);
        }
        StringBuilder varString = new StringBuilder();
        int summe = 0;
        for(Map.Entry<Integer,String> entry : getNBiggest(5,liste).entrySet()){
            summe += entry.getKey().intValue();
            varString.append(entry.getValue());
        }
        System.out.println("Summe der 5 grössten ("+varString+") ist "+summe);
    }
    
    public static Map<Integer,String> getNBiggest(int n, TreeMap<Integer,String> map){
        int size = map.keySet().size();
        TreeMap<Integer,String> result = new TreeMap<Integer,String>();        
        int counter = 0;
        for(Integer key : map.keySet()){
            if(counter++>=size-n){
                result.put(key,map.get(key));
            }
        }
        return result;
    }
Antwort: funktioniert nicht bei "doppelt vorkommenden Keys", ist also Quatsch
 

messi

Bekanntes Mitglied
Wie wär's mit:

erstes Feld ist M: int[] M = new int[28]
M füllen.
zweites Feld erstellen: int[] N = new int[n];
nur einen Durchlauf: Wenn das kleinste Element von N kleiner ist als das aktuelle von M, wird es durch dieses ersetzt. Am Ende sind in N die n-größten Elemente.
 

Janny

Mitglied
Das müsste ich dann aber auch mit einem zweidimensionalen Array machen, damit ich weiß, welche Variablen verwendet wurden.
Ich habe jetzt die Variante von Mag1c übernommen. Sie funktioniert meiner Meinung nach ganz gut und lässt sich von einem Anfänger auch leicht verstehen.

Vielen Dank für eure Hilfe !
 

messi

Bekanntes Mitglied
Dann speicherst du in N halt nicht die Werte, sondern die Indizes:
Code:
    private static void highest(int[] M, int[] N) {
        for (int m = 0; m < M.length; m++) {
            for (int n = 0; n < N.length; n++) {
                if (M[m] >= M[N[n]]) {
                    for (int k = N.length - 1; k > n; k--)
                        N[k] = N[k - 1];
                    N[n] = m;
                    break;
                }
            }
        }
    }
	
    public static void main(String[] args) {
        int[] num = new int[] {123, 456, 789, 43, 58, 243, 3, 56,
                               78, 8, 54, 2, 5, 87, 8, 98787,
                               987, 5264, 154, 14, 5264, 234};
        int[] indexes = new int[5];

        highest(num, indexes);

        int sum = 0;
        for (int i = 0; i < indexes.length; i++) {
            sum += num[indexes[i]];
            System.out.println(indexes[i] + ": " + num[indexes[i]]);
        }
        System.out.println("sum= " + sum);
    }
 

Bleiglanz

Gesperrter Benutzer
geht auch mit Map
Code:
        Random rnd = new Random();
        int[] zahlen = new int[28];
        String[] variablen = new String[28];
        Map<Integer,String> zuordnung = new HashMap<Integer,String>();
        for(int i=0;i<28;i++){
            zahlen[i]=rnd.nextInt(10); // mit zufallszahlen belegt
            variablen[i]="var"+i; // irgendwelche namen
            zuordnung.put(Integer.valueOf(zahlen[i]),variablen[i]); // namen der variablen speichern
        }
        Arrays.sort(zahlen);
        StringBuilder varString = new StringBuilder();
        int summe = 0;
        for(int i=zahlen.length-5;i<zahlen.length;i++){
            summe += zahlen[i];
            varString.append(zuordnung.get(Integer.valueOf(zahlen[i])));
        }
        System.out.println("Summe der 5 grössten ("+varString+") ist "+summe);
 

Janny

Mitglied
Vielen Dank für euere Hilfe, aber ich hab jetzt halt das von Mag1c genommen, weil ich es als erstes verstanden habe. Inzwischen habe ich es auch erfolgreich in mein Programm implementiert.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
7 6 int variablen vergleichen Allgemeine Java-Themen 34
C Erste Schritte Variablen in abhängigkeit von Git branch Allgemeine Java-Themen 7
Fabiator Variablen Variablen Zählen Allgemeine Java-Themen 3
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
berserkerdq2 Labels in IJVM sind keine lokalen Variablen oder? Allgemeine Java-Themen 2
O Fehler bei Variablen Allgemeine Java-Themen 2
N File Path mit Variablen angeben Allgemeine Java-Themen 1
nonickatall Methoden Kann man Klassen/Methoden aus Variablen heraus aufrufen? Allgemeine Java-Themen 6
R Geometry erstellen die abhängig von Variablen ist Allgemeine Java-Themen 6
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
P static Blocks und variablen Allgemeine Java-Themen 41
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
V Datentypen Graphikrechner 2/Strings und Variablen in Doubles umwandeln Allgemeine Java-Themen 6
S Kann man Variablen oder Felder definieren deren Typ zwei Interfaces ist..? Allgemeine Java-Themen 9
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
D BlueJ, Variablen die mehrfach vorkommen gleichzeitig umbenennen Allgemeine Java-Themen 3
C Variablen Variablen mit unendlichem Wert Allgemeine Java-Themen 22
J Variablen Mehrere int-variablen in txt abspeichern und danach wieder auslesen Allgemeine Java-Themen 1
T Maximale Felder maximale Variablen Allgemeine Java-Themen 2
W Lebendige Variablen herauslesen Allgemeine Java-Themen 1
K Summierung einer Variablen Allgemeine Java-Themen 5
B Gibt es eine Funktion die den Datentyp einer Variablen ermittelt? Allgemeine Java-Themen 8
X Threads Externe Variablen in Run Methoden verändern Allgemeine Java-Themen 4
Messoras Klassen Sämtliche Variablen einer Klasse übernehmen Allgemeine Java-Themen 6
K Static Variablen verbieten Allgemeine Java-Themen 10
I Problem beim Aufrufen, von Objektmethoden/ -variablen Allgemeine Java-Themen 6
J Text lesen und in Variablen speichern Allgemeine Java-Themen 3
A Best Practice Variablen vertauschen - Performance Allgemeine Java-Themen 1
F Variablen Variablen schachteln Allgemeine Java-Themen 6
C Threads Variablen in einem Thread Aktualisieren Allgemeine Java-Themen 17
M Variablen Variablen in Text einbinden Allgemeine Java-Themen 5
K Überschreiben von Variablen bei rekursivem Funktionsaufruf Allgemeine Java-Themen 2
R Übergreifende Variablen? Allgemeine Java-Themen 10
OnDemand Input/Output Variablen in Datei Speichern um sie wieder auszulesen Allgemeine Java-Themen 4
D Variablen zur Laufzeit global speichern (Registry Pattern?) Allgemeine Java-Themen 6
iB0T "goto" Befehl aus Batch in Java und Variablen wert immer wieder neu setzen Allgemeine Java-Themen 4
D ClassLoader für Variablen einer Klasse setzen Allgemeine Java-Themen 24
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
D Alle Variablen final setzen ? Allgemeine Java-Themen 26
C Kapselung Warum graift man auf Variablen nur über Methoden und nich direkt zu? Allgemeine Java-Themen 10
C Classloading und statische Variablen Allgemeine Java-Themen 2
K Variablen speichern Allgemeine Java-Themen 2
S Variablen bei Aufruf zurücksetzen Allgemeine Java-Themen 4
faetzminator statische Variablen in Interface - Vererbung? Allgemeine Java-Themen 9
V Gibt es einen Variablen Cast? Allgemeine Java-Themen 8
K Mehrere JVMs die auf eine Klasse mit statischen Variablen zugreift Allgemeine Java-Themen 19
D Wann sollte ich statische Methoden und Variablen benutzen? Allgemeine Java-Themen 44
M Generische Methoden mit Java und globale Variablen Allgemeine Java-Themen 9
J Statische Variablen, Threadübergreifend. Allgemeine Java-Themen 4
E Variablen anderer Klassen auslesen (nur Name bekannt) Allgemeine Java-Themen 4
P Variablen in einer anderen Klasse auf Änderungen überwachen Allgemeine Java-Themen 12
V Typargument einer Variablen erfragen Allgemeine Java-Themen 4
B Rechnen mit mehreren Variablen Allgemeine Java-Themen 2
G Thread variablen Sichtbarkeit Allgemeine Java-Themen 15
J Java Pfad nicht mehr in Path Variablen??? Allgemeine Java-Themen 2
T Mit JNI finale Variablen überschreiben Allgemeine Java-Themen 14
T JNI -> auf Java-Variablen etc zugreifen Allgemeine Java-Themen 6
M Bezeichnung für Component-Variablen Allgemeine Java-Themen 6
M Variablen an Java-Programm übergeben Allgemeine Java-Themen 3
Airwolf89 dynamischer Zugriff auf Variablen/ Objekte Allgemeine Java-Themen 4
A Überschreibung von Variablen Allgemeine Java-Themen 3
A JavaCC: Variablen zaehlen Allgemeine Java-Themen 12
B globale und lokale Variablen Allgemeine Java-Themen 17
G referenz von variablen Allgemeine Java-Themen 9
O getRuntime().Exec() - Environment - Variablen setzen? Allgemeine Java-Themen 2
S XML-Parsing / public-Member-Variablen / Design-Frage Allgemeine Java-Themen 8
M Variablen Speicher wieder freigeben ? Allgemeine Java-Themen 9
N Variablen eines Objektes (instanz) in einen Array lesen Allgemeine Java-Themen 7
S In Subklasse auf private Variablen zugreifen Allgemeine Java-Themen 4
S Variablen und ihre Tücken. Allgemeine Java-Themen 7
C Binärbereich einer Variablen abfragen Allgemeine Java-Themen 8
J Zugriff auf den Namen einer Variablen Allgemeine Java-Themen 7
J Überschreiben von Variablen Allgemeine Java-Themen 3
C dynamische variablen Namen! Allgemeine Java-Themen 4
M Int und String Variablen verändern Allgemeine Java-Themen 10
H zwei Date Variablen überschreiben sich Allgemeine Java-Themen 2
G Taushen der Input variablen einer method Allgemeine Java-Themen 14
P Objekt- Variablen Allgemeine Java-Themen 16
K Environment Variablen per java -D weitergeben Allgemeine Java-Themen 9
D in class-Dateien nach variablen suchen! Allgemeine Java-Themen 5
F Werte von Member-Variablen erst im Konstruktor setzen? Allgemeine Java-Themen 7
T Größe eine Variablen in Bytes? Allgemeine Java-Themen 22
B Reguläre ausdrücke mit variablen? Allgemeine Java-Themen 12
MQue JButton an verschiedenen Variablen Allgemeine Java-Themen 2
T Unabhängigkeit von Variablen/ Objekten. Allgemeine Java-Themen 6
G Frage zu statischen Variablen bei Vererbung Allgemeine Java-Themen 15
L Sichtbarkeit von Variablen / getMethode Allgemeine Java-Themen 4
H Variablen (A1, A2, A3 mit A_irgendetwas aufrufen) ohne Array Allgemeine Java-Themen 5
M Variablen in einer .doc Vorlage ersetzen Allgemeine Java-Themen 4
A Reflection - Variablen innerhalb einer Methode ermitteln Allgemeine Java-Themen 9
E Zugriff auf Variablen äusserer Klassen Allgemeine Java-Themen 2
M Variablen in Klasse verpacken? Allgemeine Java-Themen 10
F Allegemeiner Datentyp für Objekte und Primitive Variablen Allgemeine Java-Themen 6
W Array mit Variablen aus Vararg füllen Allgemeine Java-Themen 4
S Problem mit Boolean Variablen Allgemeine Java-Themen 8
A [SOLVED] Classpath und statische Variablen Allgemeine Java-Themen 6
J variablen wert ändernung mit einer art actionlistener? Allgemeine Java-Themen 4
C klassenübergreifende variablen Allgemeine Java-Themen 3
T ungewollter Zugriff auf private Variablen? Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben