2013-06-21 128 views
1

所以我有這樣的任務,我必須輸入兩個字符串,之後我找一下有沒有共同的字母,然後把它們寫出來,但只once..so例如 如果STRING1是「象聲詞」和string2爲「對話」我應該得到的: O,N,A,T,E,I ...我唯一的問題是最後一部分(「我不知道該怎麼只寫字母一次)如何只打印某些字母

這裏是我的代碼

import java.util.Scanner; 
import java.util.Arrays; 

public class Zadatak4 { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     Scanner scan = new Scanner(System.in); 
     char niz[] = new char[100]; 
     char niz2[] = new char[100]; 

     System.out.print("Add the first string: "); 
     niz = scan.nextLine().toCharArray(); 

     System.out.print("Add the second string: "); 
     niz2 = scan.nextLine().toCharArray(); 

     for (int i = 0; i < niz.length; i++) { 

      for (int j = 0; j < niz2.length; j++) { 

       if (niz[i] == niz2[j]) { 
        System.out.println(niz[i] + " "); 

        // What now!?!?!? 
       } 

      } 
     } 

    } 

} 
+3

保存他們的設置,然後打印設置。 – Maroun

+2

您正在尋找「數組中的唯一值」。見http://stackoverflow.com/questions/13796928/how-to-get-unique-values-from-array – Floris

回答

2

使用一組:

LinkedHashSet<string> printNum = new LinkedHashSet<string>(); 
if(niz[i] == niz2[j]) 
{ 
     printNum.add(niz[i]); 
} 

// outside of loop 
for(string s : printNum) 
{ 
     System.out.println(s); 
} 
1

您可以通過使用兩個HashSets做到這一點。

你每個字一個HashSet的。當你在word1中遇到一封信時,你在set1中輸入。 當你在word2中遇到字母時,你在set2中輸入。

最後,您只記住這是在兩組字母。

import java.util.HashSet; 
public class Zadatak4 { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 


     Scanner scan = new Scanner(System.in); 
     char niz[] = new char[100]; 
     char niz2[] = new char[100]; 

     System.out.print("Add the first string: "); 
     niz = scan.nextLine().toCharArray(); 

     System.out.print("Add the second string: "); 
     niz2 = scan.nextLine().toCharArray(); 

     HashSet<Integer> set1 = new <String>HashSet(); 
     HashSet<Integer> set2 = new <String>HashSet(); 


     for(int i = 0; i < niz.length; i++) 
     { 
      if(!set1.contains(niz[i])); 
      set1.add((int) niz[i]);   
     } 

     for(int i = 0; i < niz2.length; i++) 
     { 
      if(!set2.contains(niz2[i])); 
      set2.add((int) niz2[i]);    
     } 


     Iterator<Integer> it = set1.iterator(); 
     int currentChar; 
     while(it.hasNext()) 
     { 
      currentChar = it.next(); 
      if(set2.contains(currentChar)) 
      System.out.println((char)currentChar); 
     } 
    } 

} 
+0

謝謝,但來自@Captain天鷹答案是更短,工作原理是一樣... –

+0

沒有問題。我增加了一個小的優化,以品牌niz.length比較/查找,而不是niz.length * niz1.length其臃腫的代碼。 –

0

儲存在你的循環,你會想要將它們添加到最裏面的部分焦炭,坐落於

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

if(niz[i] == niz2[j]) 
{ 
    cs.add(niz[i]); 
    //System.out.println(niz[i]+" "); 

    //What now!?!?!? 
} 
1

套裝

mutuals.add(niz[i]) 

然後在l外接力在開始添加此聲明一下

Set<char> mutuals = new HashSet<char>() 

確保你做到這一點以外的環

再後來,打印出互助一切

1

幾乎每個人都暗示Set,這裏是艱辛的道路這樣做......

public static void main(String[] args) { 

    String printed = ""; 

    Scanner scan = new Scanner(System.in); 
    char niz[] = new char[100]; 
    char niz2[] = new char[100]; 


    System.out.print("Add the first string: "); 
    niz = scan.nextLine().toCharArray(); 

    System.out.print("Add the second string: "); 
    niz2 = scan.nextLine().toCharArray(); 


    for(int i = 0; i < niz.length; i++) 
    { 
     for(int j = 0; j < niz2.length; j++) 
     { 
       if(niz[i] == niz2[j]) 
       {       
        if(printed.indexOf(niz[i]) == -1) { 
          System.out.println(niz[i]+" "); 
        } 

        printed += niz[i]; 
       } 
     } 
    } 
1

的你需要的是兩個集的交集,所以你可以使用什麼是Set.retainAll()

1

一個一個班輪:

HashSet<Character> common = 
    new HashSet<Character>(Arrays.asList(niz1)).retainAll(
     new HashSet<Character>(Arrays.asList(niz2))); 
+1

這是一個更好的解決方案,不是因爲它很短,而是因爲它避免了在字符串上循環。這個問題只需要一個字符迭代器,而不是其他任何東西,都可以放入一個字符串中 - 而不是其他任何東西。 – einpoklum