0

这是独家新闻。我有一个程序循环遍历 ArrayList 并检查值是否等于输入的关键字(inputArray[0]

我想添加一个默认操作以防万一inputArray[0]不等于其中的任何值keyList

else if就是我遇到问题的地方。我希望我的循环在keyList使用“最后的手段”之前遍历所有值 - 一个 else 语句。现在我的问题是,在第一个 if 语句中,它看到inputArray[0]不等于keyList[x],它进入 else 语句而没有经过另一次循环运行。

如您所见,我尝试使用 else if 语句,如果我的循环计数器 x 大于 keyList 的大小,那么它将执行内部代码,但这似乎不起作用。我还添加continue;到 else 语句以确保它正在通过循环,根据控制台,它是。(我知道是因为System.out循环开头的语句。)

public static void wikiInit(ArrayList keyList, ArrayList nameList, ArrayList domainList, ArrayList softwareList, String[] inputArray, EntityPlayer player)
{
    System.out.println("These are the current lists:");
    System.out.println("Key List: " + keyList);
    System.out.println("Name List: " + nameList);
    System.out.println("Domain List: " + domainList);
    System.out.println("Software List: " + softwareList);

    // KEY PARSER
    for(int x = 0; x < keyList.size(); x++)
    {
        System.out.println("Starting the loop");

            if((keyList.get(x)).equals(inputArray[0]))
            {
                //getWikiName = wikiNameArray[x]
                //getWikiDomain = wikiDomainArray[x]
                //getWikiSoftware = wikiSoftwareArray[x]

                StringBuilder hyperlinkBuilder = new StringBuilder();
                    for(int y = 1; y < inputArray.length; y++)
                    {
                        hyperlinkBuilder.append(inputArray[y] + " ");   
                    }
                        if((softwareList.get(x)).equals("MEDIAWIKI"))
                        {
                            String hyperlink = "http://" + domainList.get(x) + "/index.php?search=" + hyperlinkBuilder.toString();

                            System.out.println("Searching for " + hyperlinkBuilder.toString() + " on the " + nameList.get(x));
                            player.addChatMessage("Searching for " + hyperlinkBuilder.toString() + " on the " + nameList.get(x));


                              BrowserHandler.browserInit(hyperlink.replace(" ", "+"), player);
                              System.out.println("Opening " + hyperlink.replace(" ", "+"));
                              break;
                        }

            }
            else if(x > keyList.size())
            {//LAST RESORT

            }
            else
            {
                continue;
            }
        }


    }
4

7 回答 7

4

而不是循环使用

if(keyList.contains(inputArray[0])){
  int x = keyList.indexOf(inputArray[0]); 
  StringBuilder hyperlinkBuilder = new StringBuilder();
  for(int y = 1; y < inputArray.length; y++)
    ...
}
else { // last resort code
}
于 2013-08-05T21:08:22.990 回答
2

如果默认操作应该只在检查所有元素后发生,它应该发生在循环之外。您可以通过使用变量在发生这种情况时发出信号来做到这一点:

boolean found = false;

for(int x = 0; x < keyList.size(); x++)
{
    System.out.println("Starting the loop");

        if((keyList.get(x)).equals(inputArray[0]))
        {
            found = true;
            ...
        }
}

if (!found) {
    //The value was never found, do something special.
}

话虽如此,在这种情况下,它会更容易使用keyList.contains,就像 bellabax 的回答一样。

于 2013-08-05T21:09:41.400 回答
1

我们通常这样做,首先搜索,然后放置代码以稍后处理找到的代码。

我还将其中一部分从循环中取出,因为它不需要在那里。它也可能出现在代码的“找到”部分,但我喜欢把它放在一边,使代码更具可读性。

此外,MEDIAWIKI 的测试留在循环中(与我的早期版本不同)。感谢@paxdiablo。这也是这里一些其他答案的失败(截至目前)。

StringBuilder hyperlinkBuilder = new StringBuilder(); // lift this out of the loop
for(int y = 1; y < inputArray.length; y++) {
    hyperlinkBuilder.append(inputArray[y] + " ");   
}

int found = -1;
for(int x = 0; x < keyList.size(); x++)
{
    System.out.println("Starting the inside of the loop");
    if((keyList.get(x)).equals(inputArray[0])) {
        if((softwareList.get(x)).equals("MEDIAWIKI"))
            found = x;
            break;
        } 
    }
}

if (found >= 0) {
    int x = found;

    //getWikiName = wikiNameArray[x]
    //getWikiDomain = wikiDomainArray[x]
    //getWikiSoftware = wikiSoftwareArray[x]

    String hyperlink = "http://" + domainList.get(x) + "/index.php?search=" + hyperlinkBuilder.toString();

    System.out.println("Searching for " + hyperlinkBuilder.toString() + " on the " + nameList.get(x));
    player.addChatMessage("Searching for " + hyperlinkBuilder.toString() + " on the " + nameList.get(x));

    BrowserHandler.browserInit(hyperlink.replace(" ", "+"), player);
    System.out.println("Opening " + hyperlink.replace(" ", "+"));
} else {
    //LAST RESORT ... fill in 'not found' code
}
于 2013-08-05T21:08:39.300 回答
1

一种方法是在循环之前简单地将found变量设置为 false,如果找到键匹配,则在循环内将其设置为 true。

然后在循环之后:

if (!found)
    complainBitterly();
于 2013-08-05T21:09:39.470 回答
1

尝试使用布尔值。在 for 循环之前将其设置为 false ,如果inputArray[0]等于keyList[x],则将布尔值设置为 true (在您的 if 语句中)。

然后在 for 循环之后有一个 if 语句,如果 bool 仍然为假,它将做你最后的案例。

于 2013-08-05T21:10:26.223 回答
1

好消息是您可以通过进行 2 次更改来简化此操作。

首先,提取您引用的这 4 个单独的列表,并将它们组合为一个对象列表,其中包含每个列表的字段,in the code. Second, you can track loop exit status with another variable,代码中的“ParameterTuple foundMediaWikiKey”。

/**
 * Not sure of a better name for this class, you'll need to look at in the larger sense.
 * Also, in production you probably want to use getters for these, rather than final 
 * public and the constructor
 */
public class ParameterTuple {
    public ParameterTuple(String key, String name, String domain, String software) {
        this.key = key;
        this.name = name;
        this.domain = domain;
        this.software = software;
    }

    public final String key;
    public final String name;
    public final String domain;
    public final String software;
}

public static void wikiInit(ArrayList<ParameterTuple> paramList, String[] inputArray, EntityPlayer player) {
    System.out.println("These are the current lists:");
    System.out.println("List: " + paramList);

    // Variable to keep track of how we exited the loop.
    boolean foundMediaWikiKey = false;

    // KEY PARSER
    for(ParameterTuple param : paramList)
    {
        System.out.println("Starting the loop");

        if(param.key.equals(inputArray[0])) {

            StringBuilder hyperlinkBuilder = new StringBuilder();

            for(int y = 1; y < inputArray.length; y++) {
                hyperlinkBuilder.append(inputArray[y] + " ");   
            }

            if(param.software.equals("MEDIAWIKI")) {
                String hyperlink = "http://" + param.domain + "/index.php?search=" + hyperlinkBuilder.toString();

                System.out.println("Searching for " + hyperlinkBuilder.toString() + " on the " + param.name;
                player.addChatMessage("Searching for " + hyperlinkBuilder.toString() + " on the " + param.name;


                BrowserHandler.browserInit(hyperlink.replace(" ", "+"), player);
                System.out.println("Opening " + hyperlink.replace(" ", "+"));

                // Keep track of how we exited the loop
                foundMediaWikiKey = true;
                break;
            }
        }
    }

    // When we exit, check to see how we did so.
    if (!foundMediaWikiKey) {
        // Last Resort
    }
}
于 2013-08-05T21:59:42.363 回答
0

我希望我的循环在使用“最后的手段”之前遍历 keyList 中的所有值 - 一个 else 语句

            else if(some condition)
            {
                 if(x!=keylist.size()-1)      // USE IT HERE
                 { continue; }

                 //LAST RESORT

            }
于 2013-08-05T21:08:02.150 回答