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