ArrayList
разделяешь на отдельные слова по заглавной букве, подчёркиванию и любым другим символам, допускаемым языком, в том числе и цифрам. получается два слова "array" и "list". регистр ужн оубрать, либо не учитывать его при поиске (либо учитывать, если хочется).
Далее для всех слов создаёшь комбинации, как было описано в комментарии выше, но не вручную, а автоматически
a + l = al
ar + l = arl
arr + l = arrl
...
array + l = arrayl
...
Если слов в идентификаторе больше двух, то проделываешь это для всех слов. Для каждой аббревиатуры записываешь, из какого идентификатора она была получена, одной аббревиатуре может соответствовать много различных идентификаторов).
Это может показаться страшным и занимающим кучу памяти, но идентификаторов в программах конечное число и оно довольно маленькое по машинным меркам.