Индексирование списка массивов

#java #android #arraylist

#java #Android #arraylist

Вопрос:

У меня есть подобный arraylist на Java, содержащий около 242 элементов.

 ArrayList<String> AL=new ArrayList<>();

AL.add("Apple");
AL.add("Banana");
AL.add("BArbie");
AL.add("Elephant");
AL.add("Zombie");
and so on...
  

Как только значения вставлены, я сортирую, используя

 Collections.sort(AL);
  

Теперь я хочу создать индекс для этого ArrayList на основе первого символа. В приведенном выше примере, если я хочу найти Z, это будет позиция 5 и так далее. Если выбрано значение y, то должно быть задано ближайшее предыдущее значение , в данном случае это Elephant.

В настоящее время это решение достигается путем обработки данных с использованием 2 таблиц базы данных и обработки Java. любые предложения о том, как минимизировать сложность.

Если мы получим указания о том, как перейти к альтернативному решению, мы были бы действительно счастливы.

Спасибо.

Комментарии:

1. Я не думаю, что ArrayList должен быть выбором структуры данных здесь. Вы должны изучить эту проблему с помощью Map / HashMap.

2. Конечно. Позвольте мне попробовать с этим.

3. Чего вы хотите достичь? Найти строку, которая начинается с заданного символа? Найти индекс строки? что-то еще?

4. ДА. я хочу найти первый экземпляр слова, начинающийся с заданного символа, такого как «C». если C недоступен, укажите позицию предыдущего слова.

Ответ №1:

Чтобы сделать это более наглядным, давайте предположим, что у вас есть список стран. Arrays.asList("Afghanistan", "Albania", "Eritrea", ...) Вы могли бы создать карту TreeMap<Character,List<String>> из своего списка с первым символом в качестве ключа и списком строк, который начинается с ключа в качестве значения.

Я намеренно предлагаю здесь treemap, потому что желаемая функциональность уже реализована в методах floorEntry() и floorKey().

Следующий пример должен дать вам отправную точку:

 import java.util.Arrays;
import java.util.List;
import java.util.TreeMap;
import java.util.stream.Collectors;

public class Test {

    public static void main(String[] args) throws Exception {
        List<String> countries = Arrays.asList("Afghanistan", "Albania", "Algeria",
                                                "Bahamas", "Bahrain", "Bangladesh",
                                                "Cameroon", "Canada", "Central African Republic",
                                                "Eritrea", "Estonia", "Ethiopia",
                                                "Nigeria", "North Korea", "Norway",
                                                "Sweden", "Switzerland", "Syria",
                                                "Uganda", "Ukraine", "United Kingdom",
                                                "Venezuela", 
                                                "Yemen",
                                                "Zimbabwe");

        TreeMap<Character,List<String>> map = countries.stream()
                .collect(Collectors.groupingBy(s -> s.charAt(0), TreeMap::new, Collectors.toList()));
        
        System.out.println(map.floorEntry('F').getValue().get(0));
    }
}
  

Комментарии:

1. Спасибо. Я новичок в Java. что является хорошим местом для изучения этого импорта: java.util.stream. Сборщики;

Ответ №2:

  1. Я думаю, что вы используете неправильно Collection . Если у вас нет дубликатов — тогда используйте TreeSet , в противном случае — PriorityQueue . Эти коллекции имеют внутреннюю сортировку.
  2. Насколько я понимаю, вы добавляете новые элементы и хотите восстановить новый индекс. Почему вы не используете Map<Character, Set<String>> вместо этого?!