java - 检查String ArrayList以获取多个特定的整数/字母

时间:2016-11-02 17:18:06

标签: java arrays for-loop arraylist

我正在开发一个益智程序,其中用户输入两个String数组(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个整数值。这将返回为solve = true,因为digit = 2,当5!= 2时,它将为false,但是当它为2!= 2时,它将变为true。但是,它仍然无效。

提前谢谢。

2 个答案:

答案 0 :(得分:2)

我会采用不同的方法,并使用Map<String,String>来存储等价物。要处理(xs[i]ys[i])对,逻辑是在地图中查找已绑定到xs[i]的现有值。如果未找到,请将条目xs[i]添加到ys[i]。如果找到一个,请测试地图中的绑定值是否等于ys[i];如果失败,则将“有效输入”标志设置为false。 (在处理数组之前将标志初始化为true。在处理期间,对标志的唯一可能更改是将其设置为false。)

答案 1 :(得分:0)

在您的问题中,您使用了&#34; filter&#34;两次。似乎合乎逻辑的是,您需要将列表放入流中并使用带有lambda表达式的filter()方法,而不是第三个循环和if语句。这样,您将摆脱显式迭代和标志,这将使代码更清晰:

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