我还有另一个挑战,就是当用户输入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];
}
}
}
答案 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);