代码审查:解决此Java程序的最佳方法是什么?

时间:2019-05-13 17:41:53

标签: java

请考虑给定站点内所有网页Ls中的列表URL,即列表中的所有URL都具有相同的域前缀(例如http://www.fancysite.com)。去除前缀后,每个URL的其余部分是由/b分隔的字符串序列,即形式为/abc/xyz/pqs/.../lmn.html. 要解决的问题是在给定级别上计算Ls中URL的数量。去除公共域前缀后,URL中的斜杠(即/b个字符)的数量来计算级别。例如,http://www.fancysite.com位于level 0http://www.fancysite.com/xyz/xyz.html位于level 2,依此类推。您可能会假设Ls中的URL是唯一的(即Ls没有重复项)。

对于上述问题,我在下面编写了以下代码:

List<String> ls = new ArrayList<>();

for(String url : ls){
    String [] parts = url.split(https://www.fancysite.com);
    int count=0;

    for(int i=0; i<=parts[1].length(); i++){
        if(parts[1].charAt(i)== “/“){
            count++;
        }
        S.O.P(“Level of this particular url is”+ count;
    }
}

任何评论/更新/方法将不胜感激

2 个答案:

答案 0 :(得分:2)

一个班轮:

final String URL = "https://example.com/one/two";
long level = URL.chars().filter(ch -> ch == '/').count() - 2;

在这里,我们计算字符串中的斜杠/的数量,然后在 https 之后减去2作为初始斜杠的数量。

答案 1 :(得分:1)

我想出了这个解决方案:

public static void main(String[] args) throws MalformedURLException {
        List<String> ls = new ArrayList<>();
        ls.add("https://example.com");
        ls.add("https://example.com/one");
        ls.add("https://example.com/two");
        ls.add("https://example.com/one/three");
        ls.add("https://example.com/one/one");
        ls.add("https://example.com/one/two");


        Map<Integer, List<URL>> levelToUrls = new HashMap<>();

        for(String urlRaw : ls){
            URL url = new URL(urlRaw);
            String path = url.getPath();
            String[] splitedPath = path.split("/");
            levelToUrls.computeIfAbsent(splitedPath.length - 1, integer -> new LinkedList<>()).add(url);
        }

        levelToUrls.forEach((integer, urls) -> System.out.println("Level " + integer + " How many : " + urls.size()));
    }

这将输出:

Level 0 How many : 1
Level 1 How many : 2
Level 2 How many : 3

基本上,我使用地图来存储映射到相应级别的URL列表,但是如果您不想按级别访问URL,则Map<Integer, Integer>也足够了。

使用Java 8流的结果相同:

Map<Integer, Long> levelToUrlCount = ls.stream()
                .map(s -> s.split("/").length - 3)
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));


levelToUrlCount.forEach((level, howMany) -> System.out.println("Level " + level + " How many : " + howMany));