Java - 使用AsList的另一个String数组中的String Array

时间:2014-05-20 13:42:47

标签: java arrays list iterator

尽管有搜索,我无法解决我的问题。我想在另一个String数组中查找String数组。但是这个array.asList似乎无法正常工作,因为它必须提供true。我只采用了这部分代码使其易于理解。那些"如果" s必须有效,那就是我试图实现的目标。(在paranthesis中,一切都必须返回true值)问题可能出在哪里?感谢您的帮助!

final Iterator<String[]> sic2 = sections.iterator();
String[] lines = temp.split("\n");
String[] sectionname  ;

for (int i = 0; i < lines.length; i++) { 
    while(sic2.hasNext()) {
        final String[] val2 = sic2.next();  
        //Choping up the long string in parts.
        sectionname=val2[1].split("\\|");

        for (int k=0; k<sectionname.length; k++) {
            if (lines[i].contains("200") && Arrays.asList(lines[i + 1]).contains(sectionname[k]) && lines[i + 2].contains("=")) {
                lines[i] = lines[i].replace("200", "20_"); //do this if the section names are found at the next line of section codes.
                System.out.println(true);
            }

            if (lines[i].contains("200") && Arrays.asList(lines[i]).contains(sectionname[k])    && lines[i + 1].contains("=")) {
                lines[i] = lines[i].replace("200", "20_"); //do this if the section codes and names are in the same line.

            }
        }       
    }

编辑:我相信问题的主要部分是这样的:

for (int i = 0; i < lines.length; i++) { 
    for (int k=0; k<sectionname.length; k++) {
        if (Arrays.asList(lines[i + 1]).contains(sectionname[k])) {
            //do something
        }
    }
}

4 个答案:

答案 0 :(得分:1)

我将问题解决了一下,如下所示:

private boolean allWordsAreInEachLine(String[] words, String[] lines) {
    for (String line : lines) {
        if (!allWordsAreInLine(words, line)) {
            return false;
        }
    }
    return true;
}

private boolean allWordsAreInLine(String[] words, String line) {
    for (String word : words) {
        if (!line.contains(word)) {
            return false;
        }
    }
    return true;
}

然后将其称为以下内容:

//This is where your code is currently executed
//...
//...
if (allWordsAreInEachLine(sectionNames, lines) {
    //Do whatever you want to do here...
}

答案 1 :(得分:0)

我不确定您对此有何看法,但请注意,因为lines是一维字符串数组lines[i+1]是其元素,即纯字符串。这意味着Arrays.asList(lines[i+1])创建的列表只包含一个元素lines[i+1],因此只有当此元素等于contains()时,方法true才会返回sectionname[k]。< / p>

此外,您的代码非常复杂,包含许多在链中调用的类似片段和片段,因此理解正在发生的事情并不容易。将您的长行和复杂条件分开来缩小,尝试调试代码并找到错误。

答案 2 :(得分:0)

你的迭代器也有问题,当你的第一行完成时,它不会重新开始,所以sic2.hasNext()将永远是false,你的代码将不会为i&gt做任何事情0

答案 3 :(得分:0)

我编辑并纠正了Edd的答案,他的逻辑非常好。但是,它不起作用,因为它只返回最后一个元素是true or false

所以这里是如何在较大的数组中搜索小数组。

private static boolean allWordsAreInEachLine(String[] words, String[] lines) {
    boolean found=false;
    for (String line : lines) {
        if (allWordsAreInLine(words, line)) {
            found=true; break;
        }
    }
    return found;
}

private static boolean allWordsAreInLine(String[] words, String line) {
    boolean found=false;
    for (String word : words) {
        if (line.contains(word)) {
            found=true;
            break;
        }
    }
    return found;
}

然后调用这样的函数:

for (int i = 0; i < lines.length; i++) {
    if (lines[i].contains("200") && allWordsAreInLine(words, lines[i+1]) {
        System.out.println("worked!");
        lines[i] = lines[i].replace("200", "20_"); 
    }
}