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 Réponses :
[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]
@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.
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.
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
}
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.
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.
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.