猜猜你是谁在想程序(理论)

时间:2015-08-09 21:30:39

标签: java arrays

在Java中,我正在创建一个程序,要求用户想到他们认识的人。

然后,我的程序要求他们输入他们的名字的第一个字母,以及他们姓氏的最后一个字母,没有空格。

我希望我的程序然后查看一个全名的数组,找到第一个字母与用户输入的第一个字母匹配的那个,以及它们姓氏的相应最后一个字母。

到目前为止,这是我的程序:

import java.util.* ;
public class Guesser
{
    public static void main(String[] args)
    {
        Scanner UserInput = new Scanner(System.in);
        String [] names = {"firstname lastname " + "etc"}; //example name array
        System.out.print( "Hello! I am a robot. I might be smart, but I don't know. Please play a game with me to help me see if I am smart." +  "\n"  + "What I want you to do is think of someone you know." +  "\n"  + "Enter the first letter of their first name, and the last letter of their last name. Please no spaces. Then, press enter. " );
        String TheirGuess = UserInput.nextLine(); //get their input, assign a string to it
        System.out.println("You entered: " + TheirGuess);
        char FirstChar = TheirGuess.charAt(0);  // get the the first char
        char SecondChar = TheirGuess.charAt(1);  // get the second char
        System.out.println("I will now think of someone whose first name starts    with " + FirstChar + " and last name ends with " + SecondChar );


        UserInput.close();


    }
}

我如何在我的字符串数组中搜索一个名字,其中FirstChar作为第一个字符,SecondChar作为最后一个字符?

3 个答案:

答案 0 :(得分:2)

这可以在一行代码中完成。

// Assuming you have populated a Set (actually any Collection) of names
Set<String> names;

List<String> matchedNames = names.stream()
    .filter(s -> s.matches(userInput.replaceAll("^.", "$0.*")))
    .collect(Collectors.toList());

如果您只是想打印匹配项,那就更简单了:

names.stream()
    .filter(s -> s.matches(userInput.replaceAll("^.", "$0.*")))
    .forEach(System.out::println);

此代码识别您可以有多个匹配。

虽然这看起来像勺子喂食,但这个答案的价值在于弄清楚它是如何运作的。

答案 1 :(得分:1)

执行此操作的有效方法是使用两个TreeSet个对象。一个包含名称,另一个包含姓氏。然后,您可以使用subSet()方法获取条目。所以,例如:

TreeSet<String> names = new TreeSet<>();
names.add("Antonio");
names.add("Bernard");
names.add("Peter");
names.add("Zack");

Set<String> bNames = names.subSet("B", "C");

请注意,此实现区分大小写。但是只需要很少的调整就可以解决它 - 我将它留给你。

答案 2 :(得分:0)

暂时没有写Java,但它应该是这样的:

String names[] = new String[] { "AAA BBB", "CCC DDD", "EEE FFF" };
Scanner input = new Scanner(System.in);
String userInput = input.nextLine().toLowerCase();
String result = "None";
for (String name : names) {
    String[] nameSplitted = name.toLowerCase().split(" ");
    if (nameSplitted[0].charAt(0) == userInput.charAt(0) &&
        nameSplitted[1].charAt(0) == userInput.charAt(1)
    ) {
        result = name;
        break;
    }
}
System.out.println("Result is: " + result);