我有一個如下所述的問題陳述:撰寫一個函式,將此輸入作為引數并回傳一個包含數量的資料結構
- 在每個域及其下的每個子域上記錄的點擊次數。
- 例如,點擊“mail.yahoo.com”計入“mail.yahoo.com”、“yahoo.com”和“com”的總數。
- (子域添加到其父域的左側。因此“mail”和“mail.yahoo”不是有效域。
- 請注意,“mobile.sports”在輸入底部附近顯示為一個單獨的域。)
下面是輸入資料:
String[] counts = {
"900,google.com",
"60,mail.yahoo.com",
"10,mobile.sports.yahoo.com",
"40,sports.yahoo.com",
"300,yahoo.com",
"10,stackoverflow.com",
"20,overflow.com",
"5,com.com",
"2,en.wikipedia.org",
"1,m.wikipedia.org",
"1,mobile.sports",
"1,google.co.uk"
};
以下是預期的輸出:
calculateClicksByDomain(counts) =>
com: 1345
google.com: 900
stackoverflow.com: 10
overflow.com: 20
yahoo.com: 410
mail.yahoo.com: 60
mobile.sports.yahoo.com: 10
sports.yahoo.com: 50
com.com: 5
org: 3
wikipedia.org: 3
en.wikipedia.org: 2
m.wikipedia.org: 1
mobile.sports: 1
sports: 1
uk: 1
co.uk: 1
google.co.uk: 1
我試圖為上述問題陳述寫一個解決方案:
Map<String, Integer> calculateClicksByDomainMap = new HashMap<>();
for(int i = 0; i < counts.length; i ) {
String[] seperateClickCountsAtComma = counts[i].split("\\,");
for(int j = 0; j < seperateClickCountsAtComma.length; j = 2) {
String clickCounts = seperateClickCountsAtComma[j];
String domain = seperateClickCountsAtComma[j 1];
calculateClicksByDomainMap.put(domain, Integer.parseInt(clickCounts));
}
}
for(Entry<String, Integer> domainCounts : calculateClicksByDomainMap.entrySet()) {
String domainName = domainCounts.getKey();
Integer domainCount = domainCounts.getValue();
splitStringOnOccurenceOfDot(domainName);
//System.out.println(domainName " " domainCount);
//String test[] = domainName.split("\\.");
//System.out.println(test[0] "=======" test[1] "-----");
}
public static String splitStringOnOccurenceOfDot(String domainName) {
if(!domainName.contains(".")) {
return domainName;
}
String[] subdomain = domainName.split("\\.");
domainName = subdomain[1];
System.out.println(domainName "===============" );
return splitStringOnOccurenceOfDot(domainName);
}
但是,我不確定如何使用遞回拆分字串。誰能幫助我撰寫代碼以獲得預期輸出的有效方法是什么?我有辦法使用遞回解決它嗎?感謝您的時間。
uj5u.com熱心網友回復:
Map 需要 ConcurrentHashMap,以便允許并發更新。
第一個帶有嵌套的 for 回圈可以呼叫如下遞回方法,可能不需要另一個 for 回圈:
Map<String, Integer> calculateClicksByDomainMap = new ConcurrentHashMap<>();
for (final String count : counts) {
String[] separateClickCountsAtComma = count.split("\\,");
for (int j = 0; j < separateClickCountsAtComma.length; j = 2) {
Integer clickCount = Integer.parseInt(separateClickCountsAtComma[j]);
String domain = separateClickCountsAtComma[j 1];
calculateClicksByDomainMap.put(domain, clickCount);
splitStringOnOccurenceOfDot(domain.substring(domain.indexOf(".") 1), clickCount, calculateClicksByDomainMap);
}
}
遞回添加/更新映射本身,而不是回傳一個值。
public static void splitStringOnOccurenceOfDot(String domainName, Integer domainCount, Map<String, Integer> calculateClicksByDomainMap) {
if(calculateClicksByDomainMap.containsKey(domainName)) {
Integer newCount = calculateClicksByDomainMap.get(domainName) domainCount;
calculateClicksByDomainMap.put(domainName, newCount);
} else {
calculateClicksByDomainMap.put(domainName, domainCount);
}
if(domainName.contains(".")) {
splitStringOnOccurenceOfDot(domainName.substring(domainName.indexOf(".") 1), domainCount, calculateClicksByDomainMap);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/482718.html
上一篇:合并兩個排序串列時輸出錯誤
下一篇:二維陣列中的分段錯誤
