6

これら 2 つの URL は同じである必要があります。

http://localhost?asdf=1&qwer=2
http://localhost?qwer=2&asdf=1

しかし、URL クラスの「equals()」を使用すると、それらが異なることがわかります。どうすればそれらを比較できますか?

編集:この質問の背景

URLマッピング用のSeleniumテストを作成しています。古い URL、マップ先の URL、および実際の URL があります。あるべきURLを実際のURLと比較する必要があります。URL のリストはクライアントによって作成されます。パラメータと値が同じ URL は、パラメータのリストが同じで、すべてが正しい値を持っている場合に有効と見なされます (これらのパラメータの順序は関係ありません)。

4

6 に答える 6

1

したがって、私が正しく理解できれば、クエリ部分の順序に関係なく、2 つの URL を比較する必要があります。

クラスにはこのためのメソッドがないようですURLので、独自に作成する必要があります。また、URLfinalオーバーライドできませんURL.equals(Object)

あなたのメソッドは を呼び出すことから始めることができsameFile()ます。
それが に評価される場合はtrue、 を呼び出しgetQuery()て、それをそのコンポーネントに分割します (おそらくString.split("\&") を使用)。そこから、パラメータが同じかどうかを評価します。
また、アプリケーションにとって重要な場合は、「#fragment」が等しいかどうかを確認することを忘れないでください。

于 2012-09-19T09:13:25.550 に答える
0

私はあなたがそれを好きになるとは思わないが、あなたは次のようなことをすることができる

URL url = new URL("http://localhost?asdf=1&qwer=2");
URL url2 = new URL("http://localhost?qwer=2&asdf=1");

System.out.println(isEqual(url, url2));

public static boolean isEqual(URL url1, URL url2) {

    boolean isEqual = url1.getAuthority().equals(url2.getAuthority()) &&
                    url1.getPort() == url2.getPort() &&
                    url1.getHost().equals(url2.getHost()) &&
                    url1.getProtocol().equals(url2.getProtocol());

    if (isEqual) {

        String query1 = url1.getQuery();
        String query2 = url2.getQuery();

        if (query1 != null && query2 != null) {

            if (query1.length() == query2.length()) {

                List<String> list1 = getParameters(query1);
                List<String> list2 = getParameters(query2);

                for (int index = 0; index < list1.size(); index++) {

                    String value1 = list1.get(index);
                    String value2 = list2.get(index);
                    if (!value1.equals(value2)) {

                        isEqual = false;
                        break;

                    }

                }

            } else {

                isEqual = false;

            }

        } else {

            isEqual = false;

        }

    }

    return isEqual;

}

protected static List<String> getParameters(String value) {

    List<String> parameters = new ArrayList<String>(25);

    String[] values = value.split("&");
    for (String par : values) {

        if (!par.contains("=")) {
            par += "=null";
        }

        parameters.add(par);

    }

    Collections.sort(parameters);

    return parameters;

}
于 2012-09-19T09:27:45.837 に答える
0

URL/URI equals メソッドが壊れています。少なくとも、期待どおりの結果は得られません。それには多くの奇妙なことがあります。あなたは読むことに興味があるかもしれません

Mr. Gosling – なぜ URL equals を駄目にしたの?!?

または多分

Javaで2つのURLを比較するには?

ですから、簡単だとは思わないでください。特定のケースに合わせてカスタム コンパレータを作成できますが、一般的には URL 文字列を解析する必要がある場合があります。

お役に立てれば

于 2012-09-19T09:13:08.467 に答える
-1

私はこの質問が好きなので、この小さなデモを書きました。(申し訳ありませんが、部分文字列には StringUtils クラスを使用しました)

import java.net.MalformedURLException;
import java.net.URL;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.lang.StringUtils;

public class URLDemo
{

    /**
     * @param args
     * @throws MalformedURLException
     */
    public static void main(String[] args)
        throws MalformedURLException
    {
        String url1 = "http://localhost?asdf=1&qwer=2";
        String url2 = "http://localhost?qwer=2&asdf=1";
        URL url11 = new URL(StringUtils.substringBefore(url1, "?"));
        URL url22 = new URL(StringUtils.substringBefore(url2, "?"));

        if (url11.equals(url22))
        {
            // url are equal but still need to check the parameters
            List<String> params1 = Arrays.asList(StringUtils.split(StringUtils.substringAfter(url1, "?"), "&"));
            List<String> params2 = Arrays.asList(StringUtils.split(StringUtils.substringAfter(url2, "?"), "&"));

            // need to check both ways
            if (params1.containsAll(params2) && params2.containsAll(params1))
            {
                System.out.println("URLs are the same");
            }
            else
            {
                System.out.println("URLs are different");
            }
        }
    }

}
于 2012-09-19T09:22:58.387 に答える
-2

これらの2つのURLは実際には異なります

http://localhost?asdf=1&qwer=2
http://localhost?qwer=2&asdf=1

////////編集部分//////////

これを試して....

-両方のURLで使用openStream()します。

-両方を2つのStringオブジェクトとして保存するか、StringBuilder代わりに保存します。

-次に、を使用して両方を比較しequals()ます。

-これで問題は解決すると思います。

于 2012-09-19T08:59:51.613 に答える