Nếu bạn không nhớ bằng cách sử dụng thư viện của bên thứ ba Eclipse Collections có một loại Bag
rằng có thể theo dõi số lượng nhân vật. Tôi đã cung cấp hai ví dụ bên dưới sử dụng Túi. Thật không may là không có maxByOccurrences
có sẵn ngày hôm nay trên Bag
, nhưng kết quả tương tự có thể đạt được bằng cách sử dụng topOccurrences(1)
có sẵn. Bạn cũng có thể sử dụng forEachWithOccurrences
để tìm số tối đa nhưng sẽ có nhiều mã hơn.
Ví dụ sau sử dụng CharAdapter
, cũng được bao gồm trong Bộ sưu tập Eclipse.
MutableBag<Character> characters =
CharAdapter.adapt("Scala is awesomestttttts")
.collect(Character::toLowerCase)
.toBag();
MutableList<ObjectIntPair<Character>> charIntPairs = characters.topOccurrences(2);
Assert.assertEquals(
PrimitiveTuples.pair(Character.valueOf('t'), 6), charIntPairs.get(0));
Assert.assertEquals(
PrimitiveTuples.pair(Character.valueOf('s'), 5), charIntPairs.get(1));
Ví dụ thứ hai sử dụng chars()
phương pháp có sẵn trên String
mà trả về một IntStream
. Nó cảm thấy một chút vụng về rằng một cái gì đó gọi là chars() không trả về một CharStream, nhưng điều này là bởi vì CharStream
không có sẵn trong JDK 8.
MutableBag<Character> characters =
"Scala is awesomestttttts"
.toLowerCase()
.chars()
.mapToObj(i -> (char) i)
.collect(Collectors.toCollection(Bags.mutable::empty));
MutableList<ObjectIntPair<Character>> charIntPairs = characters.topOccurrences(2);
Assert.assertEquals(
PrimitiveTuples.pair(Character.valueOf('t'), 6), charIntPairs.get(0));
Assert.assertEquals(
PrimitiveTuples.pair(Character.valueOf('s'), 5), charIntPairs.get(1));
Trong cả hai ví dụ, tôi chuyển đổi các ký tự thành chữ thường đầu tiên, do đó là 5 lần xuất hiện của 's'. Nếu bạn muốn chữ hoa và chữ thường được phân biệt thì chỉ cần thả mã chữ thường trong cả hai ví dụ.
Lưu ý: Tôi là người cam kết cho Bộ sưu tập Eclipse.
Nguồn
2016-02-21 21:41:51
'System.out.println (Collections.max (tst.chars() .boxed() .collect (Collectors.groupingBy (i -> (char) (int) i, Collectors.counting())). entrySet(), Map.Entry.comparingByValue())); ' – Holger
@Holger Điều đó không biên dịch trong intellij 15 –
@Federico Peralta Schaffner: khi tôi sao chép từ nhận xét của tôi, nó cũng không hoạt động, bởi vì bằng cách nào đó, ['U + 200C'] (http://www.fileformat.info/info/unicode/char/200c/index.htm) [' U + 200B'] (http://www.fileformat.info/info/ unicode/char/200B/index.htm) chuỗi nằm giữa '(' và ')' của 'emptySet()', vô hình nhưng gây ra lỗi trình biên dịch. Sau khi loại bỏ hai nhân vật bất hợp pháp này, nó biên dịch tốt với Netbeans và javac. – Holger