【问题标题】:How can I sort these https status codes without hardcoding every single http status code into my java program?如何在不将每个 http 状态代码硬编码到我的 java 程序中的情况下对这些 https 状态代码进行排序?
【发布时间】:2013-04-15 05:36:08
【问题描述】:

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

我想做的是对每个不是 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.");
        } 

    }

}

【问题讨论】:

    标签: java url count hyperlink


    【解决方案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());
    }
    

    【讨论】:

    • 我按照您的建议编辑了上面的代码。只是学习编码,不知道为什么它不起作用。 Eclipse 告诉我在向多图添加接口后需要一个初始化程序。
    • 我知道我的 brokenLinkCount 不再相关。
    • 您应该恢复您的编辑,因为这会使您更难理解您的原始问题。你不能使用我在一个连续块中显示的代码,我将添加 cmets 帮助你集成。请阅读代码,更重要的是,理解它。然后,如果您有后续问题发表评论。
    • 当我声明多重映射时,它告诉我它不能被解析为一个类型。我需要创建一个类或一个接口。
    • 您需要 download the Guava Collections JAR 并将其包含在您的项目构建路径中。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-16
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多