0

これがスクープです。ArrayList をループして、値が入力されたキーワードと等しいかどうかを確認するプログラムがあります( inputArray[0])

inputArray[0]内の値のいずれとも等しくない場合のデフォルト アクションを追加したいkeyList

else if私が問題を抱えているところです。keyList「最後の手段」であるelseステートメントに頼る前に、ループがすべての値を通過するようにします。現在、私の問題は、最初の if ステートメントで、それがinputArray[0]等しくないことを確認keyList[x]し、別のループを実行せずに else ステートメントに移動することです。

ご覧のとおり、else if ステートメントを使用してみました。ここで、ループのカウンター x が keyList のサイズよりも大きい場合、内部でコードを実行しますが、一見うまくいきません。また、else ステートメントに追加continue;して、ループを確実に通過するようにしました。コンソールによると、それはそうです。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そうは言っても、この場合、ベラバックスの答えのように、はるかに使いやすいでしょう。

于 2013-08-05T21:09:41.400 に答える
1

1 つの方法は、単純foundにループの前に変数を false に設定し、キーの一致が見つかった場合はループ内で変数を true に設定することです。

次に、ループの後:

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

ブール値を使用してみてください。for ループの前に false に設定し、inputArray[0]が と等しい場合はkeyList[x]、ブール値を true に設定します (if ステートメントで)。

次に、ブール値がまだ false の場合に最後のケースを実行する for ループの後に if ステートメントを追加します。

于 2013-08-05T21:10:26.223 に答える
1

幸いなことに、2 つの変更を加えることで、これをより簡単に行うことができます。

in the code. Second, you can track loop exit status with another variable,まず、参照する 4 つの個別のリストを抽出し、コード内の「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 に答える
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 に答える
0

「最後の手段」に頼る前に、ループがkeyListのすべての値を通過するようにしたい-elseステートメント

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

                 //LAST RESORT

            }
于 2013-08-05T21:08:02.150 に答える