Тогда для быстрого старта я предлагаю вам использовать HashMap. В качестве ключей используете ключевые слова из названия программ, например:
Map<String, List<Software>> dictionary = new HashMap();
List<Software> list = new ArrayList<Software>();
programs.add(new Software("Программуля плюс"));
programs.add(new Software("Программуля для детей"));
programs.add(new Software("Автобусы. Программуля"));
dictionary.put("Программуля", list);
и т.д.
Все ваши эталонные названия программ дробите на отдельные слова, объявляете каждое такое слово keywords. Тут нужно вводить ограничения на такие слова, например не менее 3 букв и только буквы и т.п. - тут вы должны сами определиться. Далее составляете списки программ, в которых встречаются такие ключевые слова, проверить если ли такая подстрока в строке - str1.toLowerCase().contains(str2.toLowerCase()).
Поиск в полученном словаре просто по ключу dictionary.get("Программуля "); - вернет вам список программ, в которых встречается искомая подстрока. Тут тоже перед тем как опрашивать - можно слегка оптимизировать, например привести к одному регистру, убрать пробелы в начале и конце и т.д.
Это самая простая реализация. Она не будет учитывать "похожие" слова, только совпадение подстроки в строке.
Сделайте все на интерфейсах, в процессе по линкам выше наберетесь знаний и сделаете более крутую реализацию, оставив интерфейс старым, подменив только реализацию.