【问题标题】:How to check and match the possible combinations of arraylist elements如何检查和匹配arraylist元素的可能组合
【发布时间】:2010-03-31 00:03:27
【问题描述】:
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 个子选项(High(H),Medium(M),Low(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^6 而不是 6!排列。
  • 这没有任何意义。如果您有 6 个组合框,每个组合框有 3 个选项,那么您的组合数量是 3^6,而不是 6!。您确定给定输入集是否有效的标准是什么?
  • @Cletus:该死,给个男人打字的机会
  • 我很好奇你想检查的案例。你有 18 种不同的东西要处理吗?还是只有几种可能的方法?
  • @一次我只比较6而不是18

标签: java recursion arraylist


【解决方案1】:

首先,您不需要为每个 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 循环。它的意思是“对 somethings 数组中的每个 something 执行一次此代码。”


如果你使用这段代码,你最终会得到一个名为 userChoice 的 ArrayList,它有类似 ["H", "H", "M", "M", "L", "L"] 的内容。

【讨论】:

  • 谢谢。 “追加”和“添加”有什么不同?
  • add 在 ArrayList 上,append 在 JComboBox 上。完全不同的两个班。这不是很明显吗? :) 他们都将东西添加到各自数据列表的末尾(尽管 add 来自集合基类型,因此在不同类型的集合上的工作方式不同,因为它的实现方式不同 - 即 Set)
  • 感谢您的评论,Jessy - 这是我的错误。 ArrayList 有一个“add”方法;它没有“附加”方法。我已经编辑了答案以使其正常工作。
【解决方案2】:

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

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

然后,您可以将用户选择映射到某个整数间隔,并且可以更轻松地做一些事情。

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

【讨论】:

  • 更容易将所有答案按规范顺序附加到字符串中。这样,如果问题的数量增加到几十个,就不会发生 int 溢出。
【解决方案3】:

首先,您应该使用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 分开;您的视图模型中的数据模型。

【讨论】:

    猜你喜欢
    • 2016-06-29
    • 2011-11-03
    • 1970-01-01
    • 2021-09-07
    • 2020-02-06
    • 2018-01-23
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    相关资源
    最近更新 更多