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

Résolu/Fermé
Seifou43 Messages postés 7 Date d'inscription jeudi 2 juillet 2020 Statut Membre Dernière intervention 15 août 2020 - 11 août 2020 à 18:39
Seifou43 Messages postés 7 Date d'inscription jeudi 2 juillet 2020 Statut Membre Dernière intervention 15 août 2020 - 15 août 2020 à 15:42
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 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié le 11 août 2020 à 20:04
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 jeudi 2 juillet 2020 Statut Membre Dernière intervention 15 août 2020
Modifié le 12 août 2020 à 18:06
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 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
12 août 2020 à 18:51
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 jeudi 2 juillet 2020 Statut Membre Dernière intervention 15 août 2020
15 août 2020 à 15:42
salut kx:

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