首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中为一个数字生成多个组合列表

在Java中为一个数字生成多个组合列表
EN

Stack Overflow用户
提问于 2010-10-21 04:38:16
回答 4查看 963关注 0票数 2

下面是我正在处理的问题和我的代码片段。是否有更好的方法来实现这一点?下面我使用了基本的控制结构。

是否最好将行和列存储在映射中,并根据键/值对对映射进行搜索?

大楼入口处有一个安全键盘。它以3x3矩阵格式有9个数字1-9。

1 2 3

4 5 6

7 8 9

安全性已决定允许一个人出现一个数字错误,但该数字应该是水平的或垂直的。示例: 5允许用户输入2、4、6、8或4,允许用户输入1、5、7。如果要输入的安全代码为1478,如果用户输入1178,则应允许输入。

下面是我正在编写的代码片段:

代码语言:javascript
复制
ArrayList<Integer> list = new ArrayList<Integer>();
int num = 9;
int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};

for(int i =0;i< arr.length;i++){
  for(int j = 0; j <arr.length;j++){
    if(num == arr[i][j]){
      row = i;
      col = j;
      break;

    }
  }
}
for(int j1 = 0; j1< 3 ; j1++){
  if(arr[row][j1] != num){
    list.add(arr[row][j1]);
  }
}
for(int i1 = 0 ; i1 <3;i1++){
  if(arr[i1][col] != num){
    list.add(arr[i1][col]);
  }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-21 04:53:48

解决这个问题的方法有很多,但我认为使用HashMaps和HashSets可以比执行几次迭代更有效地解决这个问题。

如果我是您,我将首先使用哈希映射和哈希集构建数据模型。这是因为哈希映射和哈希集具有快速查找(没有迭代)。

代码语言:javascript
复制
HashMap<Integer,HashSet<Integer>> values = new HashMap<Integer, HashSet<Integer>>();

//now put in the accepted values for one
HashSet<Integer> oneValues = new HashSet<Integer>();
oneValues.put(1);
oneValues.put(2);
oneValues.put(4);
values.put(1, oneValues);

//put in 2 values
......

然后,当您解析输入时,如果您想查看输入的值是否为代码所接受,只需执行以下操作

代码语言:javascript
复制
private boolean isAccepted(int input, int combinationValue)
{
  // check to see if the inputed value in the accepted values set
  return values.get(combinationValue).contains(input);
}
票数 1
EN

Stack Overflow用户

发布于 2010-10-21 05:05:32

我倾向于想要一个类似于isCloseTo(int a, int b)的函数,也就是说,如果我调用isCloseTo(5, 5),它将返回true。如果我调用isCloseTo(2, 5),它也应该返回true。但是如果我打电话给isCloseTo(1, 3),它就会返回false。

所以我会写这样的测试:

assertTrue(isCloseTo(5, 5));

好吧,这真的很容易通过:

代码语言:javascript
复制
public boolean isCloseTo(int a, int b) {return true;}

那么,也许

assertFalse(isCloseTo(1, 3));

在上面的实现中失败,所以我需要更改它

代码语言:javascript
复制
public boolean isCloseTo(int a, int b) {return a == b;}

这仍然是一个不完整的实现,所以我们需要另一个测试

assertTrue(isCloseTo(1, 2));

现在我们开始需要一些真正的物质。我想我会把剩下的留给读者做练习。是的,我忽略了一些棘手的问题,但这是一种策略(测试驱动的设计),它可以直接引导您找到解决方案,而不仅仅是试图编写代码。只要你保持所有的测试通过,你就会朝着一个完整的解决方案稳步前进。祝好运!

票数 0
EN

Stack Overflow用户

发布于 2010-10-21 06:02:12

或者这个..。

代码语言:javascript
复制
boolean matchDigit(int p, int d) {
   return (p==d) 
       || (p==d-3) 
       || (p==d+3) 
       || (d%3!=1 && p==d-1) 
       || (d%3!=0 && p==d+1);
} 

这假设我们已经确定p和d介于1到9之间。

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

https://stackoverflow.com/questions/3984320

复制
相关文章

相似问题

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