使用for循环在两个字符串中查找常用字母表

时间:2017-08-16 05:19:55

标签: java

我试图通过使用for循环来找到两个字符串中的常见字符。下面的代码工作正常,如果我提供两个完全不同的字符串ex.one和两个,但如果我提供两个字符串相同的输入ex.teen和青少年它不能按预期工作。

import java.util.Scanner;

public class CommonAlphabets {

    public static void main(String[] args) {
        try(Scanner input = new Scanner(System.in)){
            System.out.println("Enter String one ");
            String stringOne = input.nextLine();

            System.out.println("Enter String two ");
            String StringTwo = input.nextLine();

            StringBuffer sb = new StringBuffer();

            for(int i=0;i<stringOne.length();i++){
                for(int j=0;j<StringTwo.length();j++){
                    if(stringOne.charAt(i)== StringTwo.charAt(j)){
                        sb.append(stringOne.charAt(i));
                    }
                }
            }
            System.out.println("Common characters are " +sb.toString());
        }
    }
}

我应该创建另一个嵌套for循环来查找StringBuffer中的重复项,还是有更好的方法来处理这种情况。

5 个答案:

答案 0 :(得分:0)

您不需要内部for循环,而是使用contains代替

    String stringOne = "one";
    String stringTwo = "one";
    StringBuilder sb = new StringBuilder();

    for(int i=0;i<stringOne.length() && i < stringTwo.length ();i++){
           if(stringOne.contains(String.valueOf(stringTwo.charAt(i))) &&
                   !sb.toString().contains(String.valueOf(stringTwo.charAt(i)))){  
                                                      // check already added
                sb.append(stringTwo.charAt(i));
           }
    }
    System.out.println (sb.toString());

修改

检查以确保添加char在StringBuilder中不存在 - 可以使用Set代替

如果使用Set

Set<Character> set = new HashSet<> ();

您的逻辑可以简化为

if(stringOne.contains(String.valueOf(stringTwo.charAt(i)))){
     set.add(stringTwo.charAt(i));
}

答案 1 :(得分:0)

您可以使用Set for it。

    Set<Character> set = new HashSet<>();
    for(int i = 0; i<stringOne.length(); i++) {
        for(int j = 0; j < StringTwo.length(); j++) {
            if(stringOne.charAt(i) == StringTwo.charAt(j)){
                set.add(stringOne.charAt(i));
            }
        }
    }
    StringBuilder sb = new StringBuilder();
    for (Character c : set) {
        sb.append(c);
    }
    System.out.println("Common characters are " + sb);

答案 2 :(得分:0)

你的方法很好,因为结果显示了你期望代码很好的东西,但是你需要停止复制,因此你必须编写代码“sb&#39;变量,以便它将删除重复或在循环中编写代码,以便它不会提供重复。 因为你的代码变得越来越复杂,所以我宁愿你创建一个方法来编写代码来删除重复它会像

static void removeDuplicate(StringBuilder s){
    for(int i=0,i<s.length-1,i++){
        for(int j=i+1,j<s.length,j++){
            if(s.charAt(i)==s.charAt(j)){
                 s.deleteCharAt(j);
            }
        }
  }

在打印之前调用此方法

答案 3 :(得分:0)

您可以尝试的另一种方法是 - 合并两个输入字符串,迭代连接字符串并返回两个字符串中都存在的字符。

使用Set将确保您不会添加由于字符串连接而重复的字符。

这是我写的 -

import java.util.HashSet;

public class HelloWorld {

     private static Character[] findCommonLetters(String combined, String w1, String w2) {
         HashSet<Character> hash = new HashSet<>();
         for(char c: combined.toCharArray()) {
             if(w1.indexOf(c) != -1 && w2.indexOf(c) != -1) {
                 hash.add(c);
             }
         }
         return hash.toArray(new Character[hash.size()]);
     }
     public static void main(String []args){

        // System.out.println("Hello World");
        String first = "flour";
        String second = "four";
        String combined = first.concat(second);
        Character[] result = findCommonLetters(combined, first, second);
        for(char c: result) {
            System.out.print(c);
        }
        System.out.println();

     }
}

演示here

答案 4 :(得分:-1)

这是执行此操作的最佳方式,因为它的时间复杂度为n,因此这就是为什么这是您可以做的最好的。

import java.util.Scanner;

public class CommonAlphabets
{

public static void main(String[] args)
{
    try (Scanner input = new Scanner(System.in))
    {
        System.out.println("Enter String one ");
        String stringOne = input.nextLine();

        System.out.println("Enter String two ");
        String StringTwo = input.nextLine();

        StringBuffer sb = new StringBuffer();

        /**
         * Assuming char as index of array where A-Z is from index 0 to 25 and a-z is index 26-51
         */
        int[] alphabetArray1 = new int[52];
        for(int i = 0, len = stringOne.length(); i < len; i++)
            alphabetArray1[stringOne.charAt(i) > 94 ? stringOne.charAt(i) - 71 : stringOne.charAt(i) - 65] = 1;

        int[] alphabetArray2 = new int[52];
        for(int i = 0, len = StringTwo.length(); i < len; i++)
            alphabetArray2[StringTwo.charAt(i) > 94 ? StringTwo.charAt(i) - 71 : StringTwo.charAt(i) - 65] = 1;

//          System.out.println(Arrays.toString(alphabetArray1));
//          System.out.println(Arrays.toString(alphabetArray2));

        for (int i = 0; i < 52; i++)
            if (alphabetArray1[i] == 1 && alphabetArray2[i] == 1)
                sb.append((char) (i < 26 ? i + 65 : i + 71));

        System.out.println("Common characters are " + sb.toString());
    }
}
}