1
votes

Déplacement de données sur un tableau à 2 dimensions

J'ai un tableau à 2 dimensions qui est présenté comme:

Array[0][0] = John
Array[0][1] = Car
Array[0][2] = 4324
Array[0][3] = 4944

Array[1][0] = Jill
Array[1][1] = Bus
Array[1][2] = 5433
Array[1][3] = 6544

Array[2][0] = Peter
Array[2][1] = Bus
Array[2][2] = 5433
Array[2][3] = 6544

Fondamentalement, dans certains cas, la première partie du texte est séparée par 'et' et dans d'autres cas par ' & '. Parfois, les données utilisent même les deux.

Un exemple de mise en page de la première ligne au-dessus du tableau est:

John,Car,4324,4944
Jill,Bus,5433,6544
Peter,Bus,5433,6544
Greg,Bus,9384,4329
Jill,Truck,3213,4324
Greg,Truck,3213,4324
Bill,Truck,3213,4324
Mike,Bus,4324,3424
Greg,Bus,4324,4334
Lisa,Bus,4324,4334
John,Bus,4324,4334

Je n'ai aucune idée de la façon de traiter ce code, mais j'ai besoin chaque nom doit être sur une ligne distincte, mais toutes les données qui suivent doivent être identiques.

Ainsi, le tableau ci-dessus deviendrait:

Array[0][0] = John
Array[0][1] = Car
Array[0][2] = 4324
Array[0][3] = 4944

Donc, avec l'exemple ci-dessus, le tableau serait:

John,Car,4324,4944
Jill & Peter,Bus,5433,6544
Greg,Bus,9384,4329
Jill & Greg and Bill,Truck,3213,4324
Mike,Bus,4324,3424
Greg & Lisa & John,bus,4324,4334


3 commentaires

Commencez par écrire une classe qui représente une ligne, avec 4 propriétés nommées et typées. Ensuite, apprenez à utiliser des collections plutôt que des tableaux. Ensuite, analysez la première propriété de l'objet: s'il contient et ou &, divisez-le en noms uniques. Pour chaque pièce, créez une copie de l'objet avec juste ce nom et ajoutez-le à la liste.


Tout cela est assez basique. Où exactement avez-vous des difficultés?


@henry, basique pour vous ne signifie peut-être pas la même chose pour tout le monde. Par conséquent, nous avons StackOverflow.


3 Réponses :


3
votes
[John, Car, 4324, 4944]
[Jill, Bus, 5433, 6544]
[Peter, Bus, 5433, 6544]
[Greg, Bus, 9384, 4329]
[Jill, Truck, 3213, 4324]
[Greg, Truck, 3213, 4324]
[Bill, Truck, 3213, 4324]
[Mike, Bus, 4324, 3424]
[Greg, bus, 4324, 4334]
[Lisa, bus, 4324, 4334]
[John, bus, 4324, 4334]
[Greg, bus, 4324, 4334]
[roland, bus, 4324, 4334]
[John, bus, 4324, 4334]

4 commentaires

@Henry J'ai utilisé l'expression régulière, est-ce que ça va maintenant?


@Henry J'ai essayé avec le nom Roland, faites-le moi savoir s'il y a un autre scénario qui me manque.


Ouais, l'un des noms est: "Hernandez" et il est divisé. A part ça, ça marche vraiment bien.


@Bradie Je l'ai mis à jour testé pour le nom (Hernandez) maintenant cela fonctionne, veuillez vérifier et voir si cela fonctionne pour vous. Veuillez également accepter et voter si cela fonctionne.



3
votes

Il est préférable de créer une classe simple au lieu de baser des tableaux, qui peuvent ressembler à ceci:

@Override
public String toString() {
    return s1 + "," + s2 + "," + i1 + "," + i2;
}

Ensuite, si vous utilisez Java8 +, vous pouvez utiliser le streaming, c'est plus utile comme donc:

MyClass{s1=John, s2=Car, i1=4324, i2=4944}
MyClass{s1=Jill , s2=Bus, i1=5433, i2=6544}
MyClass{s1= Peter, s2=Bus, i1=5433, i2=6544}
MyClass{s1=Greg, s2=Bus, i1=9384, i2=4329}
MyClass{s1=Jill , s2=Truck, i1=3213, i2=4324}
MyClass{s1= Greg , s2=Truck, i1=3213, i2=4324}
MyClass{s1= Bill, s2=Truck, i1=3213, i2=4324}
MyClass{s1=Mike, s2=Bus, i1=4324, i2=3424}
MyClass{s1=Greg , s2=bus, i1=4324, i2=4334}
MyClass{s1= Lisa , s2=bus, i1=4324, i2=4334}
MyClass{s1= John, s2=bus, i1=4324, i2=4334}

pour chaque élément du tableau, diviser le premier t [0] par & ou et , puis pour chaque élément craché créez un nouvel objet, puis collectez le résultat.

démo ideone a>


La sortie ressemble à:

List<MyObject> result = Arrays.stream(array)
        .map(t -> Arrays.stream(t[0].split("\\s(&|and)\\s"))
                        .map(v -> new MyObject(v, t[1], Integer.valueOf(t[2]), Integer.valueOf(t[3])))
                .collect(Collectors.toList())
        ).flatMap(List::stream)
        .collect(Collectors.toList());

Remarque: la sortie est basée sur la toString dans la classe, vous pouvez jouez avec cette méthode pour obtenir la sortie que vous voulez, dans votre cas, si vous voulez exactement ce format, vous pouvez simplement changer toString pour être:

class MyObject {

    private String s1;
    private String s2;
    private Integer i1;
    private Integer i2;

    // constructor, getters and setters
}


2 commentaires

Je n'ai pas vu cette réponse quand j'ai mis la mienne, j'ai également recommandé de faire une classe séparée.


Merci :). Votre réponse est très agréable avec les flux. Je dois apprendre à les utiliser plus souvent: P.



2
votes

Si vos données sont un fichier CSV, je créerais d'abord ma propre classe Person :

[John, Car, 4324, 4944]
[Jill, Bus, 5433, 6544]
[Peter, Bus, 5433, 6544]
[Greg, Bus, 9384, 4329]
[Jill, Truck, 3213, 4324]
[Greg, Truck, 3213, 4324]
[Bill, Truck, 3213, 4324]
[Mike, Bus, 4324, 3424]
[Greg, bus, 4324, 4334]
[Lisa, bus, 4324, 4334]
[John, bus, 4324, 4334]

Ensuite, vous pourrez lire votre fichier CSV et l'analyser en une liste d'objets Person :

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import java.util.List;
import java.util.ArrayList;

public class Move {
    private static final String CSV_FILE = "data.csv";
    private static final String CSV_DELIMITER = ",";

    // Store list of objects here
    private static List<Person> fileData = new ArrayList<>();

    public static void main(String[] args) {

        // Parse CSV file
        String line = "";
        try (BufferedReader br = new BufferedReader(new FileReader(CSV_FILE))) {
            while ((line = br.readLine()) != null) {

                // Split data first by delimiter
                String[] data = line.split(CSV_DELIMITER);

                // Split names by & or and
                String[] names = data[0].split("&|and");

                // Add objects to list with correct conversions
                for (String name : names) {
                    String vehicle = data[1];
                    Integer firstNumber = Integer.parseInt(data[2]);
                    Integer secondNumber = Integer.parseInt(data[3]);
                    Person person = new Person(name.trim(), vehicle, firstNumber, secondNumber);
                    fileData.add(person);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        // Print out objects
        for (Person person : fileData) {
            System.out.println(person.toString());
        }
    }
}

Ce qui donne ce qui suit à partir de notre méthode personnalisée toString () : p >

public class Person {
    private String name;
    private String vehicle;
    private Integer firstNumber;
    private Integer secondNumber;

    public Person(String name, String vehicle, Integer firstNumber, Integer secondNumber) {
        this.name = name;
        this.vehicle = vehicle;
        this.firstNumber = firstNumber;
        this.secondNumber = secondNumber;
    }

    @Override
    public String toString() {
        return "[" + this.name + ", " + this.vehicle + ", " + this.firstNumber.toString() + ", " + this.secondNumber.toString() + "]";
    }
}

Remarque: La même logique ci-dessus fonctionnera si vous n'utilisez pas de fichier CSV. J'ai pensé qu'il serait également utile de montrer un exemple d'analyse de fichier CSV.


0 commentaires