【问题标题】:Indexing an array list索引数组列表
【发布时间】:2020-09-01 17:49:28
【问题描述】:

我在 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处理来处理数据来实现的。关于如何最小化复杂性的任何建议。

如果我们得到有关如何找到替代解决方案的指导,我们会非常高兴。

谢谢。

【问题讨论】:

  • 我不认为ArrayList应该是这里数据结构的选择。您应该使用 Map/HashMap 来探索这个问题。
  • 当然。让我试试看。
  • 你想达到什么目标?查找以给定字符开头的字符串?查找字符串的索引?还有什么?
  • 是的。我想找到以“C”等给定字符开头的单词的第一个实例。如果 C 不可用,则给出前一个单词的位置。

标签: java android arraylist


【解决方案1】:

为了更生动,我们假设您有一个国家/地区列表。 Arrays.asList("Afghanistan", "Albania", "Eritrea", ...) 您可以从列表中创建一个映射TreeMap&lt;Character,List&lt;String&gt;&gt;,其中第一个字符作为键,并以键作为值开头的字符串列表。

我特意在此处推荐树形图,因为您想要的功能已经在 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));
    }
}

【讨论】:

  • 谢谢。我是java新手。什么是了解此导入的好地方:java.util.stream.Collectors;
【解决方案2】:
  1. 我认为你使用了不正确的Collection。如果你没有重复 - 然后使用TreeSet,否则 - PriorityQueue。这些集合具有内部排序。
  2. 据我了解,您添加了新元素并希望检索新索引。你为什么不改用Map&lt;Character, Set&lt;String&gt;&gt;?!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-27
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 2018-05-29
    相关资源
    最近更新 更多