请考虑给定站点内所有网页Ls
中的列表URL
,即列表中的所有URL都具有相同的域前缀(例如http://www.fancysite.com
)。去除前缀后,每个URL的其余部分是由/b
分隔的字符串序列,即形式为/abc/xyz/pqs/.../lmn.html.
要解决的问题是在给定级别上计算Ls
中URL的数量。去除公共域前缀后,URL中的斜杠(即/b
个字符)的数量来计算级别。例如,http://www.fancysite.com
位于level 0
,http://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;
}
}
任何评论/更新/方法将不胜感激
答案 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));