Cancatener deux tableaux de chaine de caractere en utilisants les lists et strea

Résolu
Seifou43 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -  
Seifou43 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

est ce qu'il y a une possibilité de faire une concaténation de deux tableaux de chaine de caractère en utilisant les streams?

le premier fichier text la longeur du tableau est 3. ( voir code)
le deuxième fichier text la longeur du tableau est 4.( voir code)

il y a un point commun dans les deux fichier c'est ( startsWith("A-")).( voir code)

voici le code qui marche pour les deux fichier , mais je vais mettre un seul .

j'ai fait une petite tentative mais je ne sais pas comment résoudre le problème, je cherche à groupé les deux fichiers vers un seul fichier évidement pour faire un seul code et afficher le résultat dans deux textarea ?


 JButton btnNewButton = new JButton("New button");
  btnNewButton.addActionListener(new ActionListener(){
    Path path = Paths.get("C:/Test.txt");
    List<String[]> data = new ArrayList<>();
 /// List<String[]> data1 = new ArrayList<>(); 
    AtomicReference<String> S1 = new AtomicReference<>("");  
    Files.lines(path) 
            .map(line -> line.split("\\s+"))
            .filter(arr -> arr.length == 3)
      /////  .filter(arr -> arr.length == 4)
            .filter(arr -> arr[0].startsWith("A-")
                            || (arr[0].isEmpty() 
                            && !data.isEmpty()))
            .forEach(
                arr -> {
                    if (!arr[0].isEmpty()) {
                        S1.set(arr[0]);
                    }
                    textArea.append("data=,S1, arr[1], arr[2], arr[3]);
                    arr[0] = S1.get();
                    data.add(arr);

              //   textArea-1.append("data1= arr[1], arr[2], arr[3], arr[4]);              
              //    data1.add(arr);

            });

    for (String[] ary : data) {
        System.out.println(Arrays.toString(ary));
    }
} 



merci .
A voir également:

3 réponses

KX Messages postés 16760 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

Je vais commencer par répondre à la question que tu as posé, "est ce qu'il y a une possibilité de faire une concaténation de deux tableaux de chaine de caractère en utilisant les streams?"
Oui, évidemment, on peut concaténer des Stream avec la méthode Stream.concat(Stream,Stream).

Exemple :
Stream.concat(
        Stream.of("a1", "b1", "c1"),
        Stream.of("a2", "b2", "c2")
).forEach(System.out::println); 


Toutefois, je ne suis pas sûr que ce soit vraiment ce que tu cherches à faire, ton code est assez confus, il faudrait un exemple pour bien comprendre, en particulier le rôle de ton AtomicReference qui introduit des effets de bords qui ne devrait pas exister dans un Stream.

Tu peux essayer ce code et voir ce qu'il te manque pour faire ce que tu veux :
JTextArea textArea = new JTextArea();

Stream.concat(Files.lines(Paths.get("C:/test1.txt")),
              Files.lines(Paths.get("C:/test2.txt")))
      .map(line -> line.split("\\s+"))
      .filter(parts -> parts[0].isEmpty() || parts[0].startsWith("A-"))
      .map(parts -> Arrays.stream(parts)
                          .collect(Collectors.joining(",", "data=", "\n")))
      .forEach(textArea::append);

System.out.println(textArea.getText());

0
Seifou43 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 
salut KX:

merci pour votre réponse .

je vais changer mon code et je vais mettre un exemple simplifier de mes deux fichiers

le fichier 1:
START                              

ELEMENT

G1 G2 G3
A-0 FX 0
FX 1
A-20 FY 0
FY 1

END

le fichier 2
DATA                           

VRRP

G1 G4 G5 G6
A-0 2 B24 96

P2 P3
NO


G1 G4 G5 G6
A-20 5 C52 96

P2 P3
NO

END

je cherche à avoir ceci :
!!!!!!!!!!!  DATA1 !!!!!!!!!!
get=A-0, mget=FX, mget=0.
get=A-0, mget=FX, mget=1.
Set=A-0.
get=A-20, mget=FY, mget=0.
get=A-20, mget=FY, mget=1.
Set=A-20.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!! DATA2!!!!!!!!!
def=A-0 , get=2 ,mget=B24.
def=A-0 .
def=A-20 ,get=5 ,mget=C52.
def=A-20.

mon premier code marche si les deux fichiers sont séparer .

j'ai introduit AtomicReference parce que dans le fichier 1 la premiere collone parfois elle contiennes des lignes vides.sous ( A-0 ou A-20). voir fichier fichier1.

Nb: l'exécution se fait mais elle m’affiche l'erreur suivante :
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0
 at prog1.alfa1$2.lambda$1(alfa1.java:11)


maintennant le nouveau code sera
 Button button = new Button("RUN");
  button.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent arg0) {    

    try {
     Stream.concat(Files.lines(Paths.get("C:/FILE1.txt")), Files.lines(Paths.get("C:/FILE2.txt")))
       .map(line -> line.split("\\s+"))
       .filter(parts -> parts[0].isEmpty() || parts[0].startsWith("A-"))

// .map(parts -> Arrays.stream(parts).collect(Collectors.joining(",", "get=","mget=","mget=", "\n")))
// .map(parts -> Arrays.stream(parts).collect(Collectors.joining(",", "Set=", "\n")))
// .map(parts -> Arrays.stream(parts).collect(Collectors.joining(",", "def=","get=","mget=", "\n")))
// .map(parts -> Arrays.stream(parts).collect(Collectors.joining(",", "def=", "\n")))


       .forEach(textArea::append);

    } catch (IOException e) {
     e.printStackTrace();
    }

    System.out.println(textArea.getText());
   }

  });

merci
0
KX Messages postés 16760 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Je ne pense pas que les Stream te seront d'une grande aide ici, il faut revenir à des choses plus basiques.

Voici un exemple vite fait :

String group = null;
System.out.println("!!!!!!!!!!  DATA1 !!!!!!!!!!");
for (String line : Files.readAllLines(Paths.get("C:/File1.txt"))) {
    if (line.trim().isEmpty())
        continue;
    if (group != null) {
        if (line.startsWith("A-") || line.startsWith("END")) {
            System.out.println("Set=" + group + ".");
            group = null;
        } else {
            String[] tab = line.trim().split("\\s+");
            if (tab.length == 2) {
                System.out.println("get=" + group + ", mget=" + tab[0] + ", mget=" + tab[1] + ".");
            }
        }
    }
    if (group == null) {
        if (line.startsWith("A-")) {
            String[] tab = line.trim().split("\\s+");
            if (tab.length == 3) {
                group = tab[0];
                System.out.println("get=" + group + ", mget=" + tab[1] + ", mget=" + tab[2] + ".");
            }
        }
    }
}
System.out.println("!!!!!!!!!!  DATA2 !!!!!!!!!!");
for (String line : Files.readAllLines(Paths.get("C:/File2.txt"))) {
    if (line.trim().isEmpty())
        continue;
    if (group != null) {
        if (line.startsWith("A-") || line.startsWith("END")) {
            System.out.println("def=" + group + ".");
            group = null;
        } else {
            String[] tab = line.trim().split("\\s+");
            if (tab.length == 3) {
                System.out.println("def=" + group + ", get=" + tab[0] + ", mget=" + tab[1] + ".");
            }
        }
    }
    if (group == null) {
        if (line.startsWith("A-")) {
            String[] tab = line.trim().split("\\s+");
            if (tab.length == 4) {
                group = tab[0];
                System.out.println("get=" + group + ", get=" + tab[1] + ", mget=" + tab[2] + ".");
            }
        }
    }
}
0
Seifou43 Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 
salut kx:

j'ai modifier le programme et ça marche bien merci beaucoup pour votre support et assistance
0