2010-04-03 33 views
1

我对Java还没有太多的经验,我希望有人能够引导我走向正确的方向,因为现在我觉得我只是在靠墙撞我的头。帮助两个类之间的字段匹配

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

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

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

我不确定我究竟该如何搜索Enum对象 - 如果字段名称存储在第二个arrayList中,会更容易。但是,这两者之间的指数位置必须保持匹配,我又回到使用Enum。我认为。整个下午我一直在圈子里奔跑,我一直在想,必须有一个更简单的方法来做到这一点。我现在只是卡住了,无法看到我已经开始的事情。

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

迈克尔

回答

3

你可能最好使用地图,而不是一个列表,你可以使用枚举为重点,并获得价值了。

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

感谢您声明映射为Map而不是HashMap - 没有足够的示例代码鼓励使用接口!但我会考虑使用EnumMap而不是HashMap来提高效率。 – 2010-04-03 08:31:41

1

@汤姆推荐使用Map是首选的方法。这是一个简单的例子,它构造了一个用于静态lookup()方法的Map。每个enum类型有两个

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); 
    } 
} 

注意隐式声明静态methods

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

values()方法返回一个数组,它是非常方便的构建Map。或者,可以直接搜索数组。这些方法是隐含的;它们将在生成时出现在您的enumjavadoc中。

附录:由于@Bert˚F建议的,一个EnumMap可能是有利的。见Effective Java Second Edition项目33:使用EnumMap的,而不是有序索引,使用EnumMapenum的伴随一个引人注目的例子。

+1

#1 - 我不明白为什么map/lookup()是必须的,因为正如你指出的那样,已经有一个valueOf()方法可以做同样的事情。 lookup()更有效吗? #2 - 如果lookup()是有用的,它看起来不是线程安全的 - 在映射decl之后立即将init代码移动到静态初始化块中更好。 – 2010-04-03 08:28:21

+0

这两个权利;这个例子是微不足道的。在实际使用中,只有当O(1)查找的好处超过建设成本时,“Map”才有意义。大小可以从'EnumSet.allOf(Key.class)'推断出来。我已经更新了示例以使用静态初始化程序。 – trashgod 2010-04-03 16:14:51

+0

非常感谢您的快速回复,尤其是示例。按照建议,我将尝试使用EnumMap。 – Michael 2010-04-05 17:47:46