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
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 while
bucle 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.retainAll
hace
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);
}