如何检查和匹配arraylist元素的可能组合

时间:2010-03-31 00:03:27

标签: java recursion arraylist

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组(Ai,Bi,Ci,Di,Ei,Fi)可供选择。在每组中,有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"); 
}

谢谢。

3 个答案:

答案 0 :(得分: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中的变量通常以小写字母开头,因此我将变量名称更改为小写。)


接下来,您可以将所有六个JComboBox放入一个数组中。你会明白为什么这一点有用。

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循环。这意味着“在某些事物的数组中为每个某事执行此代码一次。”


如果您使用此代码,您最终会得到一个名为userChoice的ArrayList,其类似于[“H”,“H”,“M”,“M”,“L”,“L”]。< / p>

答案 1 :(得分:0)

为每个选项分配整数并计算使用选择的一些评估函数。

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

然后,您可以将用户选择映射到某个整数间隔,并且可以更轻松地执行某些操作。

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

答案 2 :(得分: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或您正在使用的其他任何内容中显示这些设置选项。这是故意的。您应该将业务逻辑与UI分开;您的视图模型中的数据模型。