【问题标题】:Help matching fields between two classes帮助匹配两个类之间的字段
【发布时间】:2017-10-05 17:22:55
【问题描述】:

我对 Java 的经验还不是很丰富,我希望有人能引导我朝着正确的方向前进,因为现在我觉得我只是在用头撞墙......

第一个类称为 MeasuredParams,它有 40 多个数字字段(身高、体重、腰围、腕围 - 一些 int,但大多是双精度)。第二类是称为分类器的统计分类器。它已经在 MeasuredParams 字段的一个子集上进行了训练。已训练分类器的字段名称按顺序存储在名为 reqdFields 的数组中。

我需要做的是加载一个新数组 toClassify,其中存储在 MeasuredParams 的字段中的值与 reqdFields 中的字段列表(包括顺序)匹配。我可以对 MeasuredParams 类进行任何必要的更改,但我仍然坚持使用 Classifier。

我的蛮力方法是摆脱 MeasuredParams 中的字段并改用 arrayList,并将字段名称存储在 Enum 对象中以充当索引指针。然后循环遍历reqdFields列表,一次一个元素,在Enum对象中找到匹配的名字,在arrayList中找到正确的位置。将存储在该位置的值加载到 toClassify,然后继续到 reqdFields 中的下一个元素。

我不确定我将如何准确地搜索 Enum 对象 - 如果将字段名称存储在第二个 arrayList 中会容易得多。但随后两者之间的索引位置必须保持匹配,我又回到使用枚举。我认为。我整个下午都在转圈,我一直在想一定有更简单的方法。我现在只是卡住了,看不到我已经开始的事情。

任何帮助将不胜感激。非常感谢!

迈克尔

【问题讨论】:

    标签: java arraylist compare field


    【解决方案1】:

    您可能最好使用 Map 而不是 List,您可以使用枚举作为键并取出值。

    Map<YourEnumType,ValueType> map = new HashMap<YourEnumType,ValueType>();
    

    【讨论】:

    • 感谢您将 map 声明为 Map 而不是 HashMap - 没有足够的示例代码鼓励使用接口!但我会考虑使用 EnumMap 而不是 HashMap 来提高效率。
    【解决方案2】:

    @Tom 建议使用Map 是首选方法。这是一个简单的示例,它构造了这样一个 Map 以供静态 lookup() 方法使用。

    private enum Season {
    
        WINTER, SPRING, SUMMER, FALL;
        private static Map<String, Season> map = new HashMap<String, Season>();
        static {
            for (Season s : Season.values()) {
                map.put(s.name(), s);
            }
        }
    
        public static Season lookup(String name) {
            return map.get(name);
        }
    }
    

    请注意,每个enum 类型都有两个隐式声明的静态methods

    public static E[] values();
    public static E valueOf(String name);
    

    values() 方法返回一个数组,便于构造Map。或者,可以直接搜索阵列。方法是隐式的;它们会在生成时出现在您的enumjavadoc 中。

    附录:正如@Bert F 所建议的,EnumMap 可能是有利的。请参阅Effective Java Second Edition第 33 项:使用 EnumMap 而不是序数索引,以获取使用EnumMap 关联enums 的令人信服的示例。

    【讨论】:

    • #1 - 我不明白为什么 map/lookup() 是必要的,因为正如您所指出的,已经有一个 valueOf() 方法可以做同样的事情。 lookup() 更有效吗? #2 - 如果 lookup() 有用,它看起来不是线程安全的 - 最好将 init 代码移动到 map 的 decl 之后的静态初始化块。
    • 在这两个方面都是正确的;这个例子是微不足道的。在实际使用中,Map 仅在 O(1) 查找的好处超过构造成本时才有意义。大小可以从EnumSet.allOf(Key.class) 推断出来。我已更新示例以使用静态初始化程序。
    • 非常感谢你们的快速回复,尤其是示例。按照建议,我将尝试使用 EnumMap。
    猜你喜欢
    • 2016-12-09
    • 2011-12-16
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多