调试java程序以从列出的特性中找到正确的人

9udxz4iz  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(239)

我想做一个程序,在一个名字,性别,年龄和/或国家的一个 Person 并输出正确的 NameRegistry ,当被问及上述特征时。如果是这样的话 Person 不存在,则输出为“未知”。 
例如,
测试用例1:
输入:
姓名=rob性别=男性年龄=42国家=美国
姓名=罗宾性别=男性年龄=62国家=美国
姓名=玛格达性别=女性年龄=29国家=pl
姓名=彼得性别=男性年龄=66国家=俄罗斯
姓名=皮特性别=男性年龄=6个国家=美国
姓名=晓玲性别=女性年龄=26国家=ch
输出:
所需产出标准:年龄=6国家=美国
因此,程序应该返回 PersonAge=6 以及 Country=US ,也就是“皮特”。但是,我的代码返回“未知”。
测试用例2:
输入:
姓名=约翰性别=男性年龄=46国家=英国
姓名=安妮塔性别=女性年龄=22国家=荷兰
姓名=惠子性别=女性年龄=37国家=日本
姓名=丹尼性别=男年龄=13国家=荷兰
姓名=mirjam性别=女性年龄=28国家=be
姓名=约翰尼性别=男年龄=8国家=英国
姓名=安娜性别=女性年龄=71国家/地区=西南
姓名=弗雷德性别=男年龄=51国家=荷兰
姓名=弗雷德里克性别=女性年龄=51国家=法国
姓名=rob性别=男性年龄=42国家=美国
姓名=罗宾性别=男性年龄=46国家=美国
姓名=玛格达性别=女性年龄=29国家=pl
姓名=彼得性别=男性年龄=66国家=俄罗斯
姓名=皮特性别=男性年龄=66国家=美国
姓名=弗雷德里克性别=女性年龄=51国家=法国
姓名=晓玲性别=女性年龄=26国家=ch
输出:
所需输出条件:name=xiaoling
因此,程序应该返回 PersonName=Xiaoling ,即“下龙”。但是,我的代码返回“未知”。
我的代码:

class Solution {

    private static class Person {
        private String Name = "Unknown";
        private Map<String, String> Traits = new TreeMap<>();
    }

    // constructs person from given input
    private static Person ConvertRawInputToPerson(String rawInput) {
        Person person = new Person();
        String[] traits = rawInput.split(" ");
        for (String trait : traits) {
            String[] keyValuePair = trait.split("=");
            String key = keyValuePair[0];
            String value = keyValuePair[1];
            if (key.equals("Name")) {
                person.Name = value;
            } else {
                person.Traits.put(key, value);
            }
        }
        return person;
    }

    private static boolean StringEquals(String left, String right) {
        return left.equals(right);
    }

    private static boolean HasTrait(Map<String, String> traits, Map.Entry<String, String> soughtTrait) {
        for (Map.Entry<String, String> trait : traits.entrySet()) {
            if (StringEquals(trait.getKey(), soughtTrait.getKey())
                    && StringEquals(trait.getValue(), soughtTrait.getValue())) {
                return true;
            }
        }
        return false;
    }

    static class Registry {
        List<Person> mPersons = new ArrayList<>();
        void add(Person person) {
            mPersons.add(person);
        }

        Person findMatchingPersonByRawTraits(String rawTraits) {
            Person soughtPerson = new Person();
            String[] traits = rawTraits.split(" ");
            for (String trait : traits) {
                String[] keyValuePair = trait.split("=");
                String key = keyValuePair[0];
                String value = keyValuePair[0];
                soughtPerson.Traits.put(key, value);
            }

            for (Person person : mPersons) {
                for (Map.Entry<String, String> soughtTrait : soughtPerson.Traits.entrySet()) {
                    if (HasTrait(person.Traits, soughtTrait)) {
                        return person;
                    }
                }
            }
            return new Person();
        }
    }

    // Entry point
    private static String GetNameFromRegistryByTraits(String[] rawRegistry, String soughtTraits) {
        Registry registry = new Registry();
        for (String rawInput : rawRegistry) {
            registry.add(ConvertRawInputToPerson(rawInput));
        }
        Person person = registry.findMatchingPersonByRawTraits(soughtTraits);
        return person.Name;
    }

谢谢您。

ujv3wf0j

ujv3wf0j1#

你有问题吗

for (String trait : traits) {
            String[] keyValuePair = trait.split("=");
            String key = keyValuePair[0];
            String value = keyValuePair[1]; <<<<<<< your code has index 0, make it 1
            soughtPerson.Traits.put(key, value);
        }

这将使你的第一个案例变成第二个案例:你在traits中搜索name,但在从原始数据转换时,你并没有把它放入traits中 Traits ,您正在添加到 Name 示例变量
注意这个

if (key.equals("Name")) {
                person.Name = value;
            } else {
                person.Traits.put(key, value);
            }

所以,在检查数据时,检查键是否 Name ,然后在名称中搜索,而不是 Traits

相关问题