Collections Daten in Dreiecksform

padde479

Bekanntes Mitglied
Ich habe eine Frage zu einer Dreiecksform. Ich habe in einer Datei Zahlen in Dreiecksform stehen, z. B.
Code:
 1;  2;  3;  4;  5;  6;  7;  8;  9; 10;
11; 12; 13; 14; 15; 16; 17; 18; 19;   ;
20; 21; 22; 23; 24; 25; 26; 27;   ;   ;
28; 29; 30; 31; 32; 33; 34;   ;   ;   ;
35; 36; 37; 38; 39; 40;   ;   ;   ;   ;
41; 42; 43; 44; 45;   ;   ;   ;   ;   ;
46; 47; 48; 49;   ;   ;   ;   ;   ;   ;
50; 51; 52;   ;   ;   ;   ;   ;   ;   ;
53; 54;   ;   ;   ;   ;   ;   ;   ;   ;
55;   ;   ;   ;   ;   ;   ;   ;   ;   ;
Diese Datei kann mal mehr mal weniger Zeilen/Spalten haben. Ich wollte das erst über Array lösen, die sind mir aber zu wenig dynamisch. Jetzt habe ich das über eine HashMap/TreeMap gelöst:
Java:
import java.io*;
import java.text.*;
import java.util.*;

public class Triangle {

    public static void main(String[] args) {
        Map<String, Double> triangle = new HashMap<>();

        String filename = "triangle.csv";
        File file = new File(filename);
        try {
            FileReader fileReader = new FileReader(file);
            BufferedReader bufferedReader = new BufferedReader(fileReader);

            String line;
            int index = 1;
            int year= 1;
            while ((line = bufferedReader.readLine()) != null) {
                String[] items = line.split("\\s*;\\s*");
                for (String string : items) {
                    triangle.put(year+ "-" + index, Double.parseDouble(string));
                    index += 1;
                }
                year += 1;
                index = 1;
            }
            bufferedReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // format output
        DecimalFormat format = new DecimalFormat("#,##0.00");

        Map<String, Double> treeMap = new TreeMap<String, Double>(triangle);
        Set<Entry<String, Double>> set = treeMap.entrySet();
        Iterator<Entry<String, Double>> iterator = set.iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Double> entry = (Map.Entry<String, Double>) iterator.next();
            String key = entry.getKey();
            Double val = entry.getValue();
            System.out.printf("%-" + 10 + "." + 10 + "s %12s%n", key, format.format(val));
        }
    }
}
Allerdings wird bei der Ausgabe nicht richtig sortiert. So steht in der Ausgabe folgendes:
Code:
1-1       1
1-10      10
1-2       2
...
Der von mir zusammengesetzte Schlüssel repräsentiert also Zeile/Spalte. Wie erhalte ich die korrekte Reihenfolge, also
Code:
1-1       1
1-2       2
1-3       3
...
Bin auch für andere Lösungsvorschlage als Map/HashMap/TreeMap dankbar. Es sollte also Matrix-Repräsentation sein.
 

httpdigest

Top Contributor
Was genau willst du denn überhaupt tun?
Du bist von "ich habe hier die Datei" zu "ich habe das versucht so und so zu lösen" gesprungen, ohne dabei den Teil dazwischen zu benennen: Was genau willst du mit der Datei denn machen? Was ist denn das Ziel?
Für jemanden wie uns, die das eigentlich zu lösende Problem bzw. die Anforderung nicht kennen, ist es schwer, nur anhand der Datei nachzuvollziehen, was du eigentlich machen willst.
 

padde479

Bekanntes Mitglied
Ich möchte die Daten der Datei als Matrix speichern (10x10 oder 12x12 oder wie groß die Daten in der Datei auch immer sind) und dann mit den Daten Berechnungen anstellen. So möchte ich z. B. die Summe der zweiten Spalten der Matrix durch die Summe der ersten Spalte dividieren, die Summe der dritten Spalte durch die Summe der zweiten Spalte usw.
 

KonradN

Super-Moderator
Mitarbeiter
Also erst einmal zu dem Punkt der Sortierung:
TreeMap nutzt die natürliche Reihenfolge so kein Comparator mit angegeben wurde. Und bei Strings ist 1.1* vor 1.2.
Da die Reihenfolge der entspricht, in der Du Werte einfügst, wäre ggf. die LinkedHashMap etwas, das Du nutzen willst.

Die Speicherung mit Strings als Key ist aber dann auch schlecht. Da macht es evtl. mehr Sinn, einen eigenen Datentyp zu erstellen mit gewünschter Sortierung und so.

Ich wollte das erst über Array lösen, die sind mir aber zu wenig dynamisch.
Was ist Dir denn da zu wenig dynamisch?

Generell solltest Du aber auf jeden Fall einen eigenen Datentyp haben, der das dann kapselt.

Ich möchte die Daten der Datei als Matrix speichern (10x10 oder 12x12 oder wie groß die Daten in der Datei auch immer sind) und dann mit den Daten Berechnungen anstellen. So möchte ich z. B. die Summe der zweiten Spalten der Matrix durch die Summe der ersten Spalte dividieren, die Summe der dritten Spalte durch die Summe der zweiten Spalte usw.
Wenn das die Anforderung ist, dann hast Du doch gar kein Bedarf an einer dynamischen Änderung.
 

KonradN

Super-Moderator
Mitarbeiter
Wenn es die Dreieckform hat mit immer 1 Element weniger pro Zeile, dann weisst Du nach dem Lesen der Zeile die Größe. Du siehst ja an den Beispielen: Die Anzahl der Zeilen ist gleich der Anzahl der Spalten.

Aber evtl. ist das eine Regel, die nicht gilt? Dann wäre die List aus meiner Sicht das, was das Array meistens ersetzt. Hat dann auch den Vorteil, dass man mit Streams vieles vereinfachen kann.

Das Einlesen einer Datei und dann die Verarbeitung wird dann relativ einfach:
Java:
    public List<List<Double>> parseFile(final String fileName) throws IOException {
        return Files.lines(Paths.get(fileName))
                .map(line -> parseLine(line))
                .collect(Collectors.toList());
    }

parseLine ist dann ebenso etwas wie:
Java:
    public static List<Double> parseLine(final String line) {
        return Arrays.stream(line.split("\\s*;\\s*"))
                .map(Double::parseDouble)
                .collect(Collectors.toList());
    }

Wobei hier dann natürlich auch das Thema Boxing / Unboxing zu erwähnen ist und @Robert Zenz uns dazu bestimmt noch einen Link geben wird (Den muss ich mir dann mal einspeichern für die Zukunft)

Das wäre dann eine Idee.

Dabei ist aber noch wichtig: So Typen wie List<List<Double>> sind nicht schön. Das gehört zumindest gekapselt. Und man sollte überlegen, ob man da nicht evtl. eigene Klassen einführen sollte. MatrixRow z.B.
Da würde dann auch die parse Methode rein passen und man hätte dann nur noch etwas wie List<MatrixRow> als Typ in der Klasse Matrix ...
Aber passt Matrix? Denn Matrizen sind ja doch nxm groß ...

Aber das sind dann Überlegungen, die abseits der genannten technischen Probleme sind und auf das Design eingehen.
 

Robert Zenz

Top Contributor
Wobei hier dann natürlich auch das Thema Boxing / Unboxing zu erwähnen ist und @Robert Zenz uns dazu bestimmt noch einen Link geben wird (Den muss ich mir dann mal einspeichern für die Zukunft)
Das Geheimnis ist, einmal d'rauf geklickt zu haben damit man den aus der Browser-Geschichte wieder kopieren kann.

Diese Datei kann mal mehr mal weniger Zeilen/Spalten haben. Ich wollte das erst über Array lösen, die sind mir aber zu wenig dynamisch.
Das ist doch ueberhaupt kein Problem mit etwas Fantasie. Etwas Pseudo-Code dazu:

Java:
double[][] data = new double[0][];

int currentDataIndex = 0;

for (String line : lines) {
    double[] lineData = splitToArray(line);
    
    if (currentDataIndex >= data.length) {
        data = increaseDataSize(data);
    }
    
    data[currentDataIndex] = data;
    
    currentDataIndex++;
}

Damit erhaeltst du eine 2D-Array (Matrix) welche genau deine Daten abbildet. Die einzelnen Zeilen koennen sogar unterschiedlich grosz sein. Betreten kannst du die Daten dann ganz einfach:

Java:
data[3][2] + data[3][3];

Operationen auf Bloecken davon sind dann einfach nur for Schleifen.
 

Barista

Top Contributor
Java:
package ???;

import java.util.Arrays;

/**
 *
 */
public class IntArrayList
implements IntIterable //, Cloneable
{
    public static final int INITIAL_SIZE = 8;

    public static final int INCREASING_SIZE = 8;

    private int[] intArr;

    private int size;

    public IntArrayList()
    {
        this.intArr = new int[ INITIAL_SIZE ];
    }

    public IntArrayList(
            final int initialSize )
    {
        this.intArr = new int[ initialSize ];
    }

    public void clear()
    {
        this.size = 0;
    }

    
    public void add(
            final int valueToAdd )
    {
        if ( size >= intArr.length )
        {
            increaseInnerArr();
        }

        this.intArr[ this.size++ ] = valueToAdd;
    }

    private void increaseInnerArr()
    {
        // TODO use Arrays#copyOf
        final int[] newIntArr = new int[ this.intArr.length + INCREASING_SIZE ];

        System.arraycopy(
                //src
                this.intArr ,
                //srcPos
                0 ,
                //dest
                newIntArr ,
                //destPos
                0 ,
                //length
                this.intArr.length );

        this.intArr = newIntArr;
    }

    public void addAll(
            final int[] valueToAddArr )
    {
        for ( final int valueToAdd : valueToAddArr)
        {
            this.add( valueToAdd );
        }
    }

    public int size()
    {
        return this.size;
    }

    public void setSize(
            final int sizeToSet )
    {
        this.size = sizeToSet;
    }

    public int get(
            final int index )
    {
        if ( index >= this.size )
        {
            throw new IndexOutOfBoundsException( index );
        }

        return this.intArr[ index ];
    }

    public boolean contains(
            final int valueToCheck )
    {
        for ( int i = 0 ; i < this.size ; ++i )
        {
            if ( this.intArr[ i ] == valueToCheck )
            {
                return true;
            }
        }
        return false;
    }

    public boolean containsAll(
            final IntArrayList listToCheck )
    {
        for ( int i = 0 ; i < listToCheck.size ; ++i )
        {
            if ( ! this.contains( listToCheck.intArr[ i ] ) )
            {
                return false;
            }
        }

        return true;
    }

    public int[] toArray()
    {
        // TODO use Arrays#copyOf
        final int[] resultIntArr = new int[ this.size ];

        System.arraycopy(
                //src
                this.intArr ,
                //srcPos
                0 ,
                //dest
                resultIntArr ,
                //destPos
                0 ,
                //length
                this.size );

        return resultIntArr;
    }

    //@Override
    //public IntArrayList clone() throws CloneNotSupportedException
    public IntArrayList createClone()
    {
        //return super.clone();
        final IntArrayList clone = new IntArrayList();

        clone.intArr = this.intArr.clone();

        clone.size = this.size;

        return clone;
    }

    @Override
    public IntIterator iterator()
    {
        return new IntIterator()
        {
            private int index;

            @Override
            public boolean hasNext()
            {
                return this.index < IntArrayList.this.size;
            }

            @Override
            public int next()
            {
                return IntArrayList.this.intArr[ this.index++ ];
            }
        };
    }

    @Override
    public String toString()
    {
        return Arrays.toString( Arrays.copyOf( this.intArr , size ) );
    }

}
 

Barista

Top Contributor
Java:
package ???

/**
 *
 */
public interface IntIterator
{
    public boolean hasNext();

    public int next();
}
 

Robert Zenz

Top Contributor
Bei meiner History findet man nichts mehr :) Aber ich habe in der Favoritenleiste ein Ordner nur für Foren und da dann ein Unterordner mit wichtigen Links und so ... Da ist das dann mit drin :)
:)

Wollte ich nicht mal ein Skript machen um solche Sachen direkt einfuegen zu koennen in den Beitrag? Und ich muss das ohnehin auch noch ausbauen um Gleitkommazahlen und Threading. Sind auch Themen die hier im Forum relativ oft vorkommen.
 

Blender3D

Top Contributor
Ich habe eine Frage zu einer Dreiecksform. Ich habe in einer Datei Zahlen in Dreiecksform stehen, z. B.
Code:
1; 2; 3; 4; 5; 6; 7; 8; 9; 10;
11; 12; 13; 14; 15; 16; 17; 18; 19; ;
20; 21; 22; 23; 24; 25; 26; 27; ; ;
28; 29; 30; 31; 32; 33; 34; ; ; ;
35; 36; 37; 38; 39; 40; ; ; ; ;
41; 42; 43; 44; 45; ; ; ; ; ;
46; 47; 48; 49; ; ; ; ; ; ;
50; 51; 52; ; ; ; ; ; ; ;
53; 54; ; ; ; ; ; ; ; ;
55; ; ; ; ; ; ; ; ; ;
Diese Datei kann mal mehr mal weniger Zeilen/Spalten haben. Ich wollte das erst über Array lösen, die sind mir aber zu wenig dynamisch. Jetzt habe ich das über eine HashMap/TreeMap gelöst:
Falls deine Daten immer so aufgebaut sind muss man da gar nichts speichern das lässt sich berechnen.

Java:
public static int getTriangleValue(int lineSize, int x, int y) {
        if (x < 0 || (x - 1 > lineSize - y) || y < 0 || y > lineSize)
            throw new IndexOutOfBoundsException("(" + x + "," + y + ")");
        return (lineSize * (y - 1)) - ((y - 1) * (y - 2)) / 2 + x;
    }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Mehrere Klassen mit den selben Daten Allgemeine Java-Themen 5
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
torresbig Url nach Webseiten-Login auslesen & Daten an Webseite senden Allgemeine Java-Themen 9
A Hartgecodete Daten auslagern Allgemeine Java-Themen 4
F Laden von bestimmten Daten aus TAR Archiv Allgemeine Java-Themen 23
S Webservices für binäre Daten? Allgemeine Java-Themen 5
OnDemand Daten in RAM zwischenspeichern oder lieber aus DB holen? Allgemeine Java-Themen 24
J Daten über serielle Schnittstelle empfangen Allgemeine Java-Themen 4
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
S Entities aus XML - Daten. Allgemeine Java-Themen 1
M Schnelleres Speichern von XML-Daten über URLConnection Allgemeine Java-Themen 4
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
M Daten aus MatLab Datei lesen Allgemeine Java-Themen 8
N Daten einer JCoTable in JTextArea anzeigen Allgemeine Java-Themen 7
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
C Daten für Klassifikationsverfahren gewinnen Allgemeine Java-Themen 6
J Daten von Quelltext Allgemeine Java-Themen 5
K OOP Daten addieren sich bei GUI-Eingabe Allgemeine Java-Themen 10
J Jasper Reports - Daten vom Hoster Allgemeine Java-Themen 2
kodela Daten während Laufzeit zugriffsbereit Allgemeine Java-Themen 15
J Millisekunde zwischen 2 Daten Allgemeine Java-Themen 6
Q Selbständig ActionEvent auslösen zum Daten senden über serielle Schnittstelle Allgemeine Java-Themen 7
J Daten aus Website-Quelltext auslesen Allgemeine Java-Themen 62
R Android Daten online senden Allgemeine Java-Themen 0
P Datenbank-MiniGUI fügt keine Daten ein Allgemeine Java-Themen 4
K Gespeicherte Daten von einer LinkedList auf vier LinkedList verteilen Allgemeine Java-Themen 6
Q-bert Daten von Java Programm speichern Allgemeine Java-Themen 4
K Datei (CSV-ähnlich) in Java einlesen & mit teil der Daten Graphen erstellen Allgemeine Java-Themen 9
A Erste Schritte Daten aus einer Website auslesen Allgemeine Java-Themen 7
OnDemand Desktop-Applikation schreiben, wie daten persistent? Allgemeine Java-Themen 9
S Erste Schritte Fehlender Gedanken-Ansatz bei Interpretation von Daten Allgemeine Java-Themen 1
J Auslesen Daten Java/HTML Allgemeine Java-Themen 15
K Große Mengen an Daten speichern Allgemeine Java-Themen 9
D Daten in MySQL-Datenbank schreiben Allgemeine Java-Themen 13
A Swing FileWriter schreibt keine Daten in Datei Allgemeine Java-Themen 13
M Daten aus anderen Programmen auslesen Allgemeine Java-Themen 2
D Best Practice Login-Daten: Wie am besten abrufen? Allgemeine Java-Themen 6
L Best Practice Log Dateien analysieren und eventuell passende Daten am Chart darstellen Allgemeine Java-Themen 1
J Serial Port Daten empfangen Allgemeine Java-Themen 5
H Daten via COM Schnittstelle erhalten Allgemeine Java-Themen 2
J Daten persistent speichern Allgemeine Java-Themen 14
S Allgemeine parallelisierte Loesung um Daten im Hintergrund zu laden..? Allgemeine Java-Themen 6
L Daten ohne Datenbank richtig abspeichern Allgemeine Java-Themen 5
G Daten aus Website auslesen Allgemeine Java-Themen 7
J Daten aus GUI auslesen und in Objekte umwandeln Allgemeine Java-Themen 6
O Serial Port Daten als Tastaturanschlag senden Allgemeine Java-Themen 0
N Zeitabstand zwischen 2 Daten(Mehrzahl von Datum) Allgemeine Java-Themen 3
T Input/Output Daten in eine Datei schreiben Allgemeine Java-Themen 4
Z daten bindung Allgemeine Java-Themen 1
A Datentypen Gregorian Calendar - 2 Daten sind gleich?? Allgemeine Java-Themen 3
L Vergleich-Xml-Daten Allgemeine Java-Themen 3
vandread Daten verschlüsseln mit Java oder Datenbank Allgemeine Java-Themen 15
A Daten in Formularen/Vorlagen erstellen und ausdrucken Allgemeine Java-Themen 3
C HtmlUnit Daten einer Tabelle bekommen ohne, dass diese eine ID aufweist Allgemeine Java-Themen 1
T Daten über port abfangen mit proxy server Allgemeine Java-Themen 12
Todesbote Excel Blattschutz aufheben und Daten einfügen Allgemeine Java-Themen 3
T Mit Apache Poi Daten aus einer Excel Tabelle kopieren und in Word einfügen Allgemeine Java-Themen 1
OnDemand PC identifizieren / Daten auslesen Allgemeine Java-Themen 15
G Combobox füllen mit daten aus einer Tabelle Allgemeine Java-Themen 4
J Maven .war enthält veraltete Daten Allgemeine Java-Themen 3
N Daten aus Jar laden Allgemeine Java-Themen 10
P Datentypen String-Daten zu Byte-Zahlen konvertieren - Komme nicht weiter nach vielem versuchen :-/ Allgemeine Java-Themen 7
K Input/Output Daten speichern / laden Allgemeine Java-Themen 2
M Best Practice: Daten aufnehmen-speichern-bereitstellen Allgemeine Java-Themen 8
T Daten effizient verwalten Allgemeine Java-Themen 4
B JTable eigene Daten Add Methode Allgemeine Java-Themen 2
S OOP Apache Commons Math - Verwendung von Genetics - Wie werden Daten in Chromosomen gespeichert? Allgemeine Java-Themen 4
C Daten über URL an PHP verschicken Allgemeine Java-Themen 4
R Daten aus DB auslesen in ein formular (JSP) Allgemeine Java-Themen 13
S Library fuer Internet-Text-Daten-Quellen..? Allgemeine Java-Themen 8
H OOP Daten über TCP Allgemeine Java-Themen 5
H Input/Output Binäre Daten konvertieren, Output hat Zeilenumbrüche?? Allgemeine Java-Themen 9
D Daten eines User auslesen. Allgemeine Java-Themen 5
B Input/Output Einbinden von Daten in Java Allgemeine Java-Themen 3
L Einbinden von Daten in ausführbare Jar Allgemeine Java-Themen 6
N Methoden Einzelne Daten aus "Person" auslesen Allgemeine Java-Themen 3
R SerialPort auslesen und Daten verarbeiten Allgemeine Java-Themen 23
ARadauer Wo liegen die Daten der Preferences Klasse Allgemeine Java-Themen 3
Madlip Erste Schritte Java speichert Daten im Programm?!? Allgemeine Java-Themen 9
S JDialog Daten ins JFrame übergeben Allgemeine Java-Themen 5
F Threads synchronisierung des Zugriffes auf daten Allgemeine Java-Themen 4
O Amazon S3 Anmelden / Daten downloaden Allgemeine Java-Themen 2
A Daten aufbereiten Allgemeine Java-Themen 11
P Daten kopieren mit nio - Zugriff verweigert Allgemeine Java-Themen 8
L Speichern von Daten in JKS Allgemeine Java-Themen 5
K JFreeCharts - Dummy für fehlende Daten Allgemeine Java-Themen 6
M Daten aus doc, pdf .... auslesen Allgemeine Java-Themen 12
Z Daten von einer Klasse in eine andere übertragen Allgemeine Java-Themen 8
A Login-Daten Formular automatisch ausfüllen Allgemeine Java-Themen 10
C Daten speichern und verwalten Allgemeine Java-Themen 3
Z Daten aus einer Internetseite auslesen? Allgemeine Java-Themen 2
E BlueJ Daten in Textdatei schreiben Allgemeine Java-Themen 21
T Gleichzeitige Zugriffe auf Daten auf dem Server Allgemeine Java-Themen 11
ruutaiokwu META-INF-daten bei ungepackten library-projekten während der entwicklung mit einbeziehen...? Allgemeine Java-Themen 2
K Server Daten Visualisieren Allgemeine Java-Themen 3
F HashMap überschreibt Daten von anderen HashMap Allgemeine Java-Themen 5
A Java Projekt (Daten Eingeben, Speichern und in Listen Ausgeben) Allgemeine Java-Themen 6
L Sicherstellen das 2x die gleichen Daten unter bestimmten Keys enthalten sind. Allgemeine Java-Themen 6
A XML-Daten komprimieren Allgemeine Java-Themen 6
W Datei auslesen und die Daten weiter verarbeiten Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben