给出两个单词,返回两个单词中出现的字母列表 - Java

时间:2015-07-21 17:39:06

标签: java words

我还有另一个挑战,就是当用户输入2个单词时,java会在控制台上打印两个单词中出现的字母列表。我的想法是从两个输入中创建一个char数组。但是当我这样做时,我意识到有些单词比其他单词更长(显然),所以我使用if语句来解释两种可能性(单词一大于单词2,反之亦然)。当我这样做时,我得到了一个ArrayIndexOutOfBoundsException。我不知道怎么做。我已经在StackOverflow上寻找其他解决方案。请帮忙!我的挑战方法如下。 PS:这是一个挑战"在挑战中,我必须让用户选择五个程序中的一个。当用户选择3时,它运行下面的程序。

-(void)viewWillAppear:(BOOL)animated{
    dataManager = [[DataManager alloc]init];
    [dataManager addObserver:self forKeyPath:@"currentLocation.altitude”
         options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
}


-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
              change:(NSDictionary *)change context:(void *)context{
    //if(context==locationContext)
    location = [object valueForKeyPath:keyPath];

    //If scanning just currentLocation will get 2 events send....
     if([keyPath isEqualToString:@"currentLocation.altitude"]){
         if(location != nil){
            //connect and get data (if location changed more than WILL BE SPECIFIED
            [dataManager getData];
         }
     }
 }

7 个答案:

答案 0 :(得分:2)

如果这不是非常快,我建议尽可能少编写代码,例如:给定String word1,word2:

Set<String> s1 = new HashSet<>( Arrays.asList( word1.split( "" ) ) );
Set<String> s2 = new HashSet<>( Arrays.asList( word2.split( "" ) ) );
s1.retainAll( s2 );
for( String c: s1 ) System.out.print(c);
System.out.println();

在初始化word1和word2之后替换代码。

答案 1 :(得分:1)

一个简单的正则表达式可以解决这个问题:

public static void main(String[] args) {
        String s1 = "abcd";
        String s2 = "saxydp";
        System.out.println(s1.replaceAll("[^+" + s2 + "]", "").replaceAll("(\\w).*?\\1+","$1"));    
}

O / P:

ad

说明:首先在s1中替换s2中未发生的所有内容。接下来,替换每个重复元素:)。纯粹的实验代码..

答案 2 :(得分:0)

此:

if(word1Chars.length > word2Chars.length) {
    for(int s = 1; s < word1Chars.length;) {

正在递增,直到s是两个字符串的LONGER的长度,但调用它:

if(word1Chars[s] == word2Chars[s])

因此,如果word1有10个字母,那么最终s将等于9,并且你将检查word2Chars [9],这可能超出界限。

答案 3 :(得分:0)

您可以这样做:

Scanner input = new Scanner(System.in);
System.out.println("Enter 2 strings : ");
String word1 = input.next();
String word2 = input.next();
String commonChar="";
for(char ch: word1.toCharArray()) {
    if(word2.contains(ch+"") && !commonChar.contains(ch+"")) {
        commonChar+=ch;
    }
}
System.out.println(commonChar);

O / P

Enter 2 strings : 
12345678
111222
12

在此我们检查字母是否包含在另一个单词中,然后我们添加它,但我们只添加一次。

答案 4 :(得分:0)

我认为最简单的方法是使用嵌套的for循环迭代char数组并比较每个char。然后根据需要添加到您的列表中。

类似的东西:

for (int i=0; i < word1chars.length; i++)
for(int x=0; x < word2chars.length; x++)
    if (word1chars[i] == word2chars[x])
    {
        //add your letter to your list here
    }

答案 5 :(得分:0)

使用套装可以获得更好的性能。它遵循一个例子:

import java.util.List;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

class C {
    public static void main(String[] args) {
        String w1 = "samefoo";
        String w2 = "barsame";

        Set set = new HashSet();

        char[] a1 = w1.toCharArray();
        char[] a2 = w2.toCharArray();
        List list = new ArrayList();

        for(int i = 0; i < a1.length; i++)
            set.add(a1[i]);

        for(int i = 0; i < a2.length; i++)
            if(set.contains(a2[i]))
                list.add(a2[i]);

        System.out.println(list);
    }
}

答案 6 :(得分:0)

这可能不如其他一些好,但自从我写完之后,也可以将它添加到列表中。

char[] word1Chars = word1.toCharArray(); char[] word2Chars = word2.toCharArray(); Arrays.sort(word1Chars); Arrays.sort(word2Chars); int i = 0, j = 0; String duplicates = ""; while (i < word1Chars.length && j < word2Chars.length) { if (word1Chars[i] == word2Chars[j]) { duplicates += word1Chars[i]; i++; j++; } else if (word1Chars[i] > word2Chars[j]) j++; else i++; } System.out.println(duplicates);