显示两个字符串中的常见字符,不重复

时间:2018-03-14 07:35:47

标签: java character

我需要编写一个程序,该程序应该询问用户的两个字符串并显示其中的常用字符。

它必须没有重复:即使在两个字符串中多次找到“a”,它也只能显示一次。

我的Java知识非常有限,所以我不是在寻找效率,而是在寻求可理解性。

这是我现在提出的。

//Get String 1
System.out.print( "Enter a string: " );
string1 = sc.next();

//Get String 2
System.out.print( "Enter another string: " );
string2 = sc.next();

System.out.print ( "Common characters: " );
//Common chars           
for ( a = 0 ; a < string1.length() ; a++){
    for ( b = 0 ; b < string2.length() ; b++){
        if ( string1.charAt(a) == string2.charAt(b) ){
            System.out.print(string1.charAt(a));
        }

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:3)

您可以使用输入字符串的chars()流,例如:

public class StringCharCount {
  public static void main(final String[] args) {
    final String s1 = args[0];
    final String s2 = args[1];

    s1.chars()
        .distinct()
        .mapToObj(ch -> String.valueOf((char) ch))
        .filter(s2::contains)
        .forEach(System.out::println);
  }
}

这适用于Java 8或更高版本。

  • chars()从字符串
  • 创建一个字符流
  • distinct()确保每个值只出现一次
  • mapToObj(...)是必需的,因为String#contains()方法需要String作为输入。所以我们将流值转换为String。遗憾的是,Java存在基本类型的问题,因此chars的流实际上是int的流。因此,我们必须将每个值转换为char
  • forEach(...)将每个值打印到System.out

答案 1 :(得分:1)

我会使用Set<Character>。这自然会处理重复的问题,并且有一个简单的retainAll方法来为您完成繁重的工作。

private Set<Character> characterSet(String s) {
    Set<Character> set = new HashSet<>();
    // Put each character in the string into the set.
    for (int i = 0; i < s.length(); i++) {
        set.add(s.charAt(i));
    }
    return set;
}


public Set<Character> common(String a, String b) {
    // Make a set out of each string.
    Set<Character> aSet = characterSet(a);
    Set<Character> bSet = characterSet(b);
    // Work out the common characters using retainAll.
    Set<Character> common = new HashSet<>(aSet);
    common.retainAll(bSet);
    return common;
}

public void test(String[] args) throws Exception {
    System.out.println(common("abcdef", "afxyzfffaa"));
}

答案 2 :(得分:0)

您可以使用Set

        String str1 = "abcdefg";
        String str2 = "abcaaadefg";

        StringBuilder result = new StringBuilder();
        Set<Character> sets = new HashSet<Character>();
        for(char ch : str1.toCharArray()){//init
            sets.add(ch);
        }
        for(char ch : str2.toCharArray()){
            if(sets.contains(ch)){//str1 char contains str2 char
                result.append(ch);
                sets.remove(ch);//avoid duplicates
            }
        }
        System.out.println(result.toString());