Обратите внимание на класс IPAddressUtil OOTB, присутствующий в sun.net.util, который должен вам помочь.
Способ с R
, разделение строки на каждом space
, а затем подсчет вхождений разных элементов:
EDIT С вашей третьей строкой и новым ограничением, если элементы могут быть разделены пробелом или открывающий или закрывающий кронштейн:
str <- "<= < / + * + cos sin (service <= service)+ * hello)rate"
mathsubstring <- c("<=", "<", "/", "+", "cos", "sin")
t_elt <- table(strsplit(str, " |\\(|\\)"))
t_elt[mathsubstring]
blockquote><= < / + cos sin 2 1 1 3 1 1
Если вы хотите узнать общее количество вхождений математических подстрок:
sum(t_elt[mathsubstring]) #[1] 9
Предыдущий код с предыдущим
str
table(strsplit(str, " ")) * / + < <= cos service sin 2 1 3 1 2 1 2 1
После этого вы можете удалить
service
(или другие несимметричные символы), если хотите:tab <- table(strsplit(str, " ")) mathsubstring <- c('<=', '<', '/', '+', 'cos', 'sin') tab[names(tab) %in% mathsubstring]
С вашей второй строкой:
str = "<= < / + * + cos sin service <= service + * hello rate" table(strsplit(str, " ")) * / + < <= cos hello rate service sin 2 1 3 1 2 1 1 1 2 1
Это то, что я сделал:
String str = "<= < / + * + cos sin service <= service + *";
String[] split = str.split(" ");
HashMap<String, Integer> map = new HashMap<String, Integer>();
for (String subString : split) {
if (!map.containsKey(subString)) {
map.put(subString, 0);
}
Integer current = map.get(subString);
map.put(subString, ++current);
}
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(String.format("%s = %s",entry.getKey(),entry.getValue()));
}
Вы можете использовать сборщики и счетчики.
Arrays.stream(str.split(" "))
.collect(Collectors.groupingBy(Function.identity(),
Collectors.counting()));
В результате получается Map<String, Long>
со следующим содержимым:
{<==2, service=2, cos=1, sin=1, *=2, +=3, <=1, /=1}
[[1]]
– PoGibas 13 July 2018 в 12:17sum(t_elt[mathsubstring])
– Cath 13 July 2018 в 13:20