首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查和匹配arraylist元素的可能组合

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

Stack Overflow用户
提问于 2010-03-31 08:03:27
回答 3查看 1.7K关注 0票数 3
代码语言:javascript
复制
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());

编辑:

场景:有6个组(Ai,Bi,Ci,Di,Ei,Fi)可供选择。在每个组上,有3个子选项(高(H)、中(M)、低(L)).The用户需要在6个组中的每一个上选择一个

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

在不编写很多else if的情况下,检查和匹配用户选择的最佳方式是什么?例如:

代码语言:javascript
复制
if(Ai=="High" && Bi=="High" && Ci=="Low" && Di=="High" && Ei=="Low" && Fi=="Medium") {
    System.out.println("Good Choice"); 
}

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-31 09:30:53

首先,您不需要为每个JComboBox提供新的选项列表。

代码语言:javascript
复制
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放入一个数组中。您很快就会明白为什么这是有用的。

代码语言:javascript
复制
JComboBox[] boxes = {ai, bi, ci, di, ei, fi};

现在,您可以使您的用户选择字符串如下:

代码语言:javascript
复制
// 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”的内容。

票数 2
EN

Stack Overflow用户

发布于 2010-03-31 08:13:03

将整数赋值给每个选项,并计算一些使用选项的评估函数。

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

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

但是,你到底想用它做什么呢?

票数 0
EN

Stack Overflow用户

发布于 2010-03-31 11:56:21

首先,您应该使用enum来表示这3个选项。== (您在字符串上使用的)在枚举常量上是安全的,因为它们肯定是单例。enum常量可以很容易地与字符串(toStringvalueOf)相互转换。

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

在最一般的情况下,您必须准备好相互独立地处理所有3^6个值。也就是说,我假设你不是在做分组处理,比如“只要有更多的高点而不是低点,就做X”。

我建议使用Map将设置组合映射到操作对象。

代码语言:javascript
复制
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分开,将数据模型与视图模型分开。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2549535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档