Вместо того чтобы генерировать исключение, вы можете обрабатывать ошибки с помощью обратного вызова. Таким образом, вы можете иметь дело с несколькими исключениями в списке. В приведенном ниже решении используется новый класс с поддерживающим TreeMap и обратным вызовом для обработки дубликатов либо в исходном массиве, переданном в конструктор, либо для дополнительных элементов, добавленных с помощью метода addItem.
Код выдает следующий вывод:
Constructor:
We have a dupe: 0 which has occurred 2 times so far
We have a dupe: 0 which has occurred 3 times so far
We have a dupe: 1 which has occurred 2 times so far
We have a dupe: 0 which has occurred 4 times so far
We have a dupe: 2 which has occurred 2 times so far
Add new items:
Duplicate 4 has had 2 occurrences
Frequency List
0 appears 4 times
1 appears 2 times
2 appears 2 times
3 appears 1 times
4 appears 2 times
Обратите внимание, что addItem и конструктор перегружены для обработки нулевого обратного вызова и что второй вызов addItem передает выражение Lambda в качестве обратного вызова. .
import java.util.Set;
import java.util.TreeMap;
interface DupeHandler{
public void handleDupe(Integer dupValue, Integer dupCount);
}
class FrequencyList {
private TreeMap<Integer, Integer> _tm = new TreeMap<Integer, Integer>();
public FrequencyList(int[] array){
this(array, (DupeHandler)null);
}
public FrequencyList(int[] array, DupeHandler m){
for(var i : array){
addItem(i,m);
}
}
public void addItem(Integer i){
addItem(i, null);
}
public void addItem(Integer key, DupeHandler m){
Integer count = _tm.get(key);
if(count==null){
_tm.put(key, Integer.valueOf(1));
} else {
Integer newCount = (Integer.valueOf(count+1));
_tm.put(key, newCount);
if(m!=null){
m.handleDupe(key, newCount);
}
}
}
public Set<Integer> getUniqueValues(){
return _tm.keySet();
}
@Override
public String toString() {
StringBuilder sb=new StringBuilder();
sb.append("\nFrequency List\n");
for(var k:_tm.keySet()){
sb.append("\t" + k.toString() + " appears " + _tm.get(k).toString()+ " times\n");
}
return sb.toString();
}
}
public class FrequencyListTest implements DupeHandler{
public static void main(String[] args) {
int[] intArray = new int[] {0,0,1,0,1,2,0,2,3};
FrequencyListTest flt = new FrequencyListTest();
System.out.println("Constructor: ");
FrequencyList fl = new FrequencyList(intArray, flt);
System.out.println("\nAdd new items: ");
fl.addItem(4,flt);
// callback can also be passed in as a lambda expression
fl.addItem(4,(n,c)->
System.out.println("Duplicate " + n + " has had " + c + " occurrences"));
System.out.println(fl);
}
@Override
public void handleDupe(Integer dupValue, Integer dupCount) {
System.out.println("We have a dupe: " + dupValue + " which has occurred " + dupCount + " times so far");
}
}