在java(java 1.8)中计算属性文件(只是值)中唯一字数的最佳方法是什么 例如,条目可能是:
key1=This is my value for error {0}
key2=This is success message.Great.
输出应为10(包括{0})
我尝试了什么
property.load(in);
Enumeration em = property.keys();
while (em.hasMoreElements()) {
String str = (String) em.nextElement();
completeString =completeString+property.get(str);
}
Set<String> myset=new HashSet<>();
String s[]=completeString.split("[ .]");
for(int i=1;i<s.length;i++){
myset.add(s[i]);
}
for (String sss: myset){
System.out.println(sss);
}
的System.out.println(myset.size());
我们在java 1.8中有一个更简单的方法
答案 0 :(得分:1)
我使用了假人Properties
Properties prop = new Properties();
prop.put("A", "This is my value for error {0}");
prop.put("B", "This is success message.Great.");
使用您使用的相同逻辑,您可以简单地在迭代中拆分每个属性的String
:
Set<String> set = new HashSet<>();
Enumeration em = property.keys();
while (em.hasMoreElements()) {
String str = (String) em.nextElement();
for(String s : str.split("[ .]")){
set.add(s);
}
}
定义模式以拆分每个“单词”。
Pattern pattern = Pattern.compile("[ .]");
现在,首先让我们的Stream<String>
获取我们的值。
您可以选择List<Object>
:
Stream<String> stream =
//Create a `List<Object>` from the enumeration and stream it
Collections.list(prop.elements()).stream()
//Convert in String
.map(o -> (String)o);
或Stream
Map.Entry
的{{1}}:
Properties
(不确定哪个更有效)
然后,您所要做的就是Stream<String> stream =
prop.entrySet().stream() //Iterate the Map.Entry<Object,Object>
.map(e -> (String)e.getValue())
flatMap
将每个Stream
拆分为新的String
。
Stream<String>
然后将 stream.flatMap(pattern::splitAsStream) //split based on the pattern define and return a new `Stream<String>`
收集到Stream
Set
结果将是一个很好的 .collect(Collectors.toSet()); //collect in a `Set<String>`
打印如下:
Set
[Great, success, for, This, {0}, is, my, error, message, value]