2017-08-16 77 views
-3

我想通過使用for循環找到兩個字符串中的常見字符。下面的代碼工作正常,如果我提供兩個完全不同的字符串ex.one和兩個,但如果我提供兩個字符串具有相同的輸入exteenteen和青少年它不會按預期工作。使用for循環查找兩個字符串中的常見字母

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的重複或是否有更好的方式來處理這種情況。

+4

定義「正常工作」。定義「不按預期工作」。 – John3136

+1

您所有案例的預期產出是多少? –

+0

正常工作意味着輸入前的共同特徵。一個和兩個顯示爲o,而輸入青少年和青少年顯示爲十個。 – gowthamjs23

回答

0

你並不需要一個內部的循環,但用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)); 
} 
+0

@Downvoter,請隨時提及您爲什麼低估了某人的評論/問題/答案。 – Aman

0

您可以使用set它。

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); 
-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()); 
    } 
} 
} 
+0

並比較您的代碼與我的可讀性 –

+1

對不起,但比較Code VS Mine的時間複雜度。 我的'n'和你的'n^2' –

+0

這些字符串是'青少年和青少年'的 - 因爲這種可讀性肯定更好 –

0

以及你的做法是罰款,結果顯示你期待有前面的代碼是好的,但你需要停止複製,因此你必須寫爲「SB」變量,這樣的代碼它會刪除重複或在循環中編寫代碼,以便它不會提供重複。 爲你的代碼變得複雜閱讀,所以我寧願你讓編寫代碼來刪除重複的方法它就會像

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); 
      } 
     } 
    } 

調用此方法打印

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