Intersección de n Strings

TOP 10:

Estoy trabajando en un programa para encontrar los caracteres de la intersección de n strings.I escribir el siguiente código:

import java.util.ArrayList;
import java.util.Scanner;
public class TestJoin {

public static void main(String[] args) {

  Scanner sc=new Scanner(System.in);


      int n=sc.nextInt();  // no of strings
      String s1 =sc.next().toLowerCase();
      ArrayList<Character> set1 = new ArrayList<Character>();
      while(n-->1)
      {
          String s2 =sc.next().toLowerCase();
          ArrayList<Character> set2 = new ArrayList<Character>();
          for(char c : s1.toCharArray()) {
                set1.add(c);
            }
          for(char c : s2.toCharArray()) {
                set2.add(c);
            }
          set1.retainAll(set2);
          for(char c : set1)
          {
              s1=Character.toString(c);
          }
      }
       for(char c :set1)
      System.out.println(c);


  }
}

Cuando trato de imprimir el carácter que da salida equivocada.

Entrada-

 3
 aabcde
 abazx
 yuabna

Resultados previstos: aab

Salida real: AABB

podómetro:

El uso de un método separado a menudo hace que los problemas más pequeños y más fáciles de resolver.

Le sugiero que primero haga un método para calcular la intersección de 2 String, y luego se puede utilizar en su whilebucle para calcular la intersección de las cadenas entrantes con la intersección actual.

Traté de mantener su lógica, y escribí mi propio bucle de mantener, ya que no estoy seguro de lo que la List.retainAllhace

Este método calcula la intersección de 2 String:

private static String intersectionOf(String s1, String s2) {
    List<Character> list1 = new ArrayList<>();
    for(char c : s1.toCharArray()) {
        list1.add(c);
    }
    List<Character> list2 = new ArrayList<>();
    for(char c : s2.toCharArray()) {
        list2.add(c);
    }

    StringBuilder intersection = new StringBuilder();
    for(Character c : list1) {
        if(list2.contains(c)) {
            intersection.append(c);
            list2.remove(c); // remove it so it is not counted twice
        }
    }
    return intersection.toString();
}

Ahora puede usarlo en su bucle, la lógica parece mucho más simple

public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);

    int n = sc.nextInt();  // no of strings

    String result = sc.next().toLowerCase();
    String s;
    while(n-- > 1) {
        s = sc.next().toLowerCase();
        result = intersectionOf(result, s);
    }
    for(char c : result.toCharArray())
        System.out.println(c);
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=190521&siteId=1
Recomendado
Clasificación