【问题标题】:java - check String ArrayList for multiple specific integers/lettersjava - 检查字符串数组列表中的多个特定整数/字母
【发布时间】:2016-11-02 17:18:05
【问题描述】:

我正在开发一个益智程序,其中用户输入两个字符串数组(xs,ys),数组的长度可能会有所不同。每个数组中的每个元素都是等价的。我必须搜索两个数组并找到相似的值来解决它。

我所做的是创建一个包含等效元素的 ArrayList。但是,我必须过滤 ArrayList 才能找到特定的值。

例如,如果用户输入 xs = [x, y, 1, x] ys = [3, 4, 1, 3] 这意味着 x = 3, y = 4, 1 = 1, x = 3

我现在要做的是过滤包含相似值的 ArrayList(匹配),以确保它只包含一种类型的整数。 例如,如果用户输入: xs = [x, y, 1, x] ys = [3, 4, 1, 5] 那么这将是无效的,因为 x 不能同时是 3 和 5。

我开始使用 IF 语句编写代码,但是,考虑到用户可以输入的可能值,我意识到这样做效率不高。我还意识到我的求解布尔值也可以被覆盖。我在下面复制了我的代码:

ArrayList<String> match = new ArrayList<String>();
for (i = 0; i < size; i++) {
    match.add(xs[i]); //filtering equivalent elements
    match.add(ys[i]);

    for (j = 0; j < size; j++) {
        if ((xs[i] == xs[j]) || ys[i] == ys[j] || xs[i] == ys[j] || ys[i] == xs[j]) {
            match.add(xs[j]); // adding any other values which are same
            match.add(ys[j]);
        }

        for (t = 0; t < match.size(); t++) {
            boolean hasDigit = (match.get(t)).matches(".*\\d.*");
            int digit = (-1); // initialising digit

            if (hasDigit && digit == (-1)) {
                digit = match.get(t); // all integers must be equal to this value to be considered valid
                solve = true;
            } else if (hasDigit && digit == match.get(t) && digit != (-1)) {
                solve = true;
            } else if (hasDigit && digit != match.get(t) && digit != (-1)) {
                solve = false;
            }
        }

我认为这是错误的原因是因为假设我有 x (2, 5, 2) 的 3 个整数值。由于 digit = 2,这将返回为 solve = true,当 5 != 2 时,它将为 false,但当它执行 2 != 2 时,它将变为 true。但是还是无效。

提前谢谢你。

【问题讨论】:

  • 你为什么要在-1周围加上括号?
  • 我已经习惯了,让事情看起来更清晰。
  • stackoverflow.com/a/40099027/3344829987654321@的类似帖子上查看我的 SO 答案

标签: java arrays for-loop arraylist


【解决方案1】:

我会以不同的方式处理这个问题,并使用Map&lt;String,String&gt; 来存储等价。要处理 (xs[i], ys[i]) 对,逻辑是在映射中查找已经绑定到 xs[i] 的现有值。如果没有找到,添加条目绑定xs[i]ys[i]。如果找到,则测试映射中的绑定值是否等于ys[i];如果失败,则将“有效输入”标志设置为false。 (在处理数组之前将标志初始化为true。在处理过程中,唯一可能的标志更改是将其设置为false。)

【讨论】:

  • 仍然,您在这里假设 [x,y,x] 即使不是有效条目,他指定用户可以并且将在第一个数组中输入相同的变量。我在这里错过了什么吗?
  • @AhmadAlsanie - 如果xs[x, y, x],那么如果ysxsx 的每个位置具有相同的值,则它将是有效的。这就是 OP 所描述的,这就是我的方法将要做的。
  • 为了清楚起见,ys 也可以保存变量。所以像 xs=[x, y, 1, x] ys = [u, 2, 1, 3] 这样的东西仍然有效因为 x=u=3、y=2 和 1=1。
  • 所以只要第一个 arr[1] = x 和第二个 arr2[1]=x,第一个和第二个数组是否保存 vars 并不重要,是的,这会起作用.感谢您的澄清。 +1
  • 我的方法需要稍作修改才能处理xsys 中同一位置的两个变量。您需要区分绑定值和别名。这可以通过第二个映射来完成,这次是 Map&lt;String, Set&lt;String&gt;&gt;,其中包含每个变量的别名。当您在同一位置遇到xu 时,请为x 添加别名u,并为u 添加别名x。必须有更多的逻辑来处理这个问题。 (如果任何别名获得绑定值,它们都会这样做。)
【解决方案2】:

在您的问题中,您两次使用了“过滤器”一词。您需要将列表放入流中并将 filter() 方法与 lambda 表达式一起使用,而不是第三个循环和 if 语句,这似乎是合乎逻辑的。这样,您将摆脱显式迭代和标志,这将使代码更加简洁:

match.stream()
     .filter(e -> ...)
     ...;

【讨论】:

    猜你喜欢
    • 2013-10-19
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 2016-03-20
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多