0

我有一个接收 ArrayList 的方法。检查每个元素中的 url 以查看它是否连接。如果状态码不是 200,则将 url 添加到一个断开链接的计数中。正如你所看到的,我也打印了带有消息的 url 和 status 代码。

我想做的是对每个不是 200 的不同状态代码进行计数。

因此,我将获得断开链接的总数,以及非 200 状态代码的每个实例的计数。例如,如果有 5 个 404 的 http 状态,它们将被单独计算,任何其他状态代码也不是200。

我不想将每个状态代码作为计数变量硬编码到我的代码中,我想知道代码是否可以为每个不同的状态创建一个新的计数变量?

这是我目前的方法:

public static void LinkSorter(List x){
        System.out.println("processing...");
        int brokenLinkCount = 0;

        for(int i=0; i<x.size();i++){

            try{

                URL url = new URL((String) x.get(i));
                URLConnection conn = url.openConnection();
                conn.connect();
                HttpURLConnection httpCon = (HttpURLConnection)conn;
                int statusCode = httpCon.getResponseCode();
                String statusMessage = httpCon.getResponseMessage();

                if(statusCode != 200){
                    System.out.println((String) x.get(i) + statusCode + statusMessage);
                    brokenLinkCount++;
                }

              catch(MalformedURLException e) {
                System.out.println("MalformedURL Exception");
                System.out.println(e.getMessage());
                brokenLinkCount++;

            } catch(IOException e){
                System.out.println("IOException");
                System.out.println(e.getMessage() + "IOException");
                brokenLinkCount++;                  
            }   

        }

        if(brokenLinkCount == 0){
            System.out.println("There are no broken links.");
        }else if(brokenLinkCount == 1){
            System.out.println("There is 1 broken link.");
        }else{
        System.out.println("There are " + brokenLinkCount + " broken links.");
        } 

    }

}

4

2 回答 2

1

您可以使用MultiMap,键是状态代码,值是断开的链接。这几乎会自动让你们两个:

  • 每个单独的非 200 状态代码(作为键)
  • 与每个代码关联的“损坏”链接的计数 ( map.get(code).size())

伪代码:

// declare a multimap, somewhere before you need to first access it
Multimap<Integer, String> brokenLinkMap = ArrayListMultiMap.create();

// use the map, in your current if block
if(statusCode != 200){
    System.out.println((String) x.get(i) + statusCode + statusMessage);
    brokenLinkMap.put(statusCode, url.toExternalForm()); // <-- adding to the map!
}

// after all links have been processed, you can dump the map contents
for(final Integer key : brokenLinkMap.keys()) {
    System.out.printf("Broken link count for status %s: %s\n", key, brokenLinkMap.get(key).size());
}

或者,您可以使用所有标准 JDK 类:

// declare a map of lists, somewhere before you first need to access it
Map<Integer, List<String>> brokenLinkMap = new HashMap<Integer, List<String>>(4);

// use the map, in your current if block
if(statusCode != 200){
    System.out.println((String) x.get(i) + statusCode + statusMessage);
    if(! brokenLinkMap.containsKey(statusCode)) {
        List<String> brokenLinkList = new ArrayList<String>(8);
        brokenLinkMap.put(statusCode, brokenLinkList);
    }

    brokenLinkMap.get(statusCode).add(url.toExternalForm()); // <-- adding to the map!
}

// after all links have been processed, you can dump the map contents
for(final Integer key : brokenLinkMap.keys()) {
    System.out.printf("Broken link count for status %s: %s\n", key, brokenLinkMap.get(key).size());
}
于 2013-04-22T10:42:06.020 回答
1

我猜你可以使用 java.util.Map,使用状态码作为键,值作为计数器。

于 2013-04-22T10:44:56.970 回答