2010-03-31 69 views
3
String [] A = {"High","Medium","Low"}; 
String [] B = {"High","Medium","Low"}; 
String [] C = {"High","Medium","Low"}; 
String [] D = {"High","Medium","Low"}; 
String [] E = {"High","Medium","Low"}; 
String [] F = {"High","Medium","Low"}; 

JComboBox Ai = new JComboBox(A); JComboBox Bi = new JComboBox(B); 
JComboBox Ci = new JComboBox(C); JComboBox Di = new JComboBox(C); 
JComboBox Ei = new JComboBox(E); JComboBox Fi = new JComboBox(F); 

.... 

//add the user choice in arrayList 
ArrayList<String> a = new ArrayList<String>(); 
a.add((String) Ai.getSelectedItem()); 
a.add((String) Bi.getSelectedItem()); 
a.add((String) Ci.getSelectedItem()); 
a.add((String) Di.getSelectedItem()); 
a.add((String) Ei.getSelectedItem()); 
a.add((String) Fi.getSelectedItem()); 

EDITED的可能的组合:
场景: 有选择的6组(艾,铋,次,狄,EI,网络连接)。在每个组中,有3个子选择(高(H),中(M),低(L)),用户需要选择一个在每个6组如何检查和匹配数组列表元素

的选择可以是例如“HHHLLL”或“MMMLLM”或“HHLLMM”等。

什么是最好的方式来检查和匹配用户的选择,而不写很多else if? 例如

if(Ai=="High" && Bi=="High" && Ci=="Low" && Di=="High" && Ei=="Low" && Fi=="Medium") { 
    System.out.println("Good Choice"); 
} 

谢谢。

+2

除非我失去了一些有3^6不是6的东西!排列。 – cletus 2010-03-31 00:06:01

+0

这没有任何意义。如果你有6个组合框,每个组合框有3个选择,那么你的组合数是3^6,而不是6 !.您确定一组给定的输入是否有效的准则是什么? – Jherico 2010-03-31 00:07:15

+0

@Cletus:该死的,给一个人机会型 – Jherico 2010-03-31 00:07:52

回答

2

首先,你不需要给的选择,JComboBox的每一个新的列表。

String[] choices = {"High", "Medium", "Low"}; 

JComboBox ai = new JComboBox(choices); 
JComboBox bi = new JComboBox(choices); 
JComboBox ci = new JComboBox(choices); 
JComboBox di = new JComboBox(choices); 
JComboBox ei = new JComboBox(choices); 
JComboBox fi = new JComboBox(choices); 

(在Java中的变量通常以小写字母开头,所以我改变了变量名称为小写)。


接下来,你可以把所有六个JComboBoxes在数组中。你会明白为什么这是有用的。现在

JComboBox[] boxes = {ai, bi, ci, di, ei, fi}; 

,你可以让你的用户选择的字符串是这样的:

// Create an ArrayList of Strings, where each string is either "H", "M", or "L" 
ArrayList<String> userChoice = new ArrayList<String>() 

for (JComboBox box : boxes) { 
    // Go through this code once for each JComboBox in boxes 
    // The first time through, "box" means the first JComboBox 
    // The second time through, "box" is the second JComboBox, etc. 
    if (box.getValue().equals("High")) { 
     userChoice.add("H"); 
    } else if (box.getValue().equals("Medium")) { 
     userChoice.add("M"); 
    } else if (box.getValue().equals("Low")) { 
     userChoice.add("L") 
    } 
} 

那for-each循环可能不熟悉。它的意思是“经过这一次代码为阵列出头的每个东西”。


如果您使用此代码,你会拥有一个ArrayList名为userChoice有类似[ “H”, “H”, “M”, “M”, “L”,“L “。

+0

谢谢。是什么与“追加”和“添加”? – Jessy 2010-03-31 02:30:20

+0

附加是ArrayList中,追加上的JComboBox不同。两个完全不同的类。这不是很明显吗?:)他们都添加东西到他们各自的数据列表的末尾(虽然加来自集合基类型,因此在不同类型的集合中工作方式不同,因为它的实现方式不同 - 即Set) – 2010-03-31 19:22:14

+0

感谢评论,Jessy--这是我的错误。 ArrayList有一个“add”方法;它没有“追加”方法。我编辑了答案,以便它能正常工作。 – Wesley 2010-03-31 19:29:33

0

分配整数每个选择和计算使用了一些选择的评价函数。

例如:Ai * 3^0 + Bi * 3^1 + ... + Fi * 3^5

然后,你将不得不选择用户映射到特定的整数区间,并可能用它做什么容易。

但是,你有什么真正想用它做什么?

+0

我的数学是如此之弱:-( – Jessy 2010-03-31 00:21:37

+0

更容易在规范顺序所有答案只是追加到一个字符串。这样没有可能INT溢出,如果问题的数量增长到了几十个。 – tucuxi 2010-03-31 00:31:25

0

首先,你应该使用enum代表3种选择。 ==(你在字符串上使用)在枚举常量上是安全的,因为它们保证是单例。一个enum常数可以很容易地转换为字符串(toStringvalueOf)。

所以现在你有6个变量,每个可以有3个值之一,所以有3^6种可能的情况。处理它们的最好方法是什么?

在最一般的情况下,您必须准备好独立处理所有3^6值。也就是说,我假设你没有进行分组处理,例如“只要有更多的高点低于X点就行”。

我建议使用Map映射的设定组合来操作对象。

enum Setting { 
    High, Medium, Low; 
} 

class SettingCombination { 
    List<Setting> combo = ...; 
    // should be immutable, with proper equals and hashCode @Override 
    // should also have named getters for each of the 6 settings 
} 

interface SettingCombinationHandler { 
    void handle(SettingCombination settings);  
} 

class SettingCombinationHandlingService { 
    Map<SettingCombination, SettingCombinationHandler> handlers = ...; 
    // perhaps provide a default handler as well 
} 

这个想法是,对于每个有效的组合,你映射一个特定的处理程序。映射不必是一个对一个 - 几个组合可以被映射到相同的处理,如果这适合您的需求(实际组合作为参数传递给handle所以如果需要它可以区分它们)。

现在,请注意,我还没有解决,你将如何显示在JComboBox或者您可以使用其他任何这些设置选项。这是故意的。您应该将您的业务逻辑与用户界面分开;您的视图模型中的数据模型。