【问题标题】:How to get an Arraylist's name Java如何获取 Arraylist 的名称 Java
【发布时间】:2020-04-13 03:25:30
【问题描述】:

我想在 java 中获取给定 ArrayList 的名称。

例如:

Arraylist<Arraylist> listOfArrays

Arraylist<String> stringListOne (lets say this has 3 elements)
Arraylist<String> stringListTwo (this one too)

listOfArrays.add(stringlistOne);
listOfArrays.add(stringlistTwo);

如果我想执行以下操作,String listName = listOfArrays.get(1)... 它只会给我List stringlistTwo

但我需要列表的名称本身,"stringlistTwo",虽然我没有找到任何方法。

有可能吗?

或者我需要用ArrayLists 的名字创建一个List

【问题讨论】:

  • 在 java 中没有办法做到这一点。您可以拥有任意数量的变量来指向内存中的单个对象。它怎么知道给你哪个变量名?如果需要用列表存储关联数据,可以使用Map&lt;String, List&lt;String&gt;&gt; 或创建包装对象等。
  • 你想用这个名字做什么?正如 azurefrog 告诉你的那样,这不可能如你所描述的那样。
  • 你可以使用 Map 来映射 ArrayList 的名字
  • 正如@azurefrog 所说,这是不可能的。不过,我很想知道您为什么要这样做。这很可能是XY Problem,在这种情况下,几乎可以肯定,无论您的最终目标是什么,都有一种更合理的方式来实现。
  • 变量名是通常只有在开发和查看源代码时才会感兴趣的信息。在运行时,您实际上不需要知道任何这些信息。如果您确实认为您需要这些信息,那么这听起来确实像糟糕的设计和典型的XY Problem

标签: java string list arraylist


【解决方案1】:

您可能正在寻找Map。映射允许您通过可散列键(例如名称字符串)来识别值。流行的实现包括HashMapTreeMap。前者一般更快,而后者是排序的:

Map<String, List<String>> mapOfLists = new HashMap<>();

Arraylist<String> stringListOne (lets say this has 3 elements)
Arraylist<String> stringListTwo (this one too)

mapOfLists.put("StringListOne", stringListOne);
mapOfLists.put("StringListTwo", stringListTwo);

您现在可以按名称访问您的列表:

List<String> someList = mapOfLists.get("StringListTwo");

这与您在示例中的内容不完全一样。不建议使用可变对象作为键,因为哈希值可能会改变。相反,您可能只想将索引映射到名称。为此,您并不严格需要 Map 对象,因为 List 可以解释为将连续非负整数映射到值的特殊情况。最简单的解决方案可能是创建与listOfArrays 平行的名称列表:

List<String> listOfNames = new ArrayList<>();
listOfNames.add("StringListOne");
listOfNames.add("StringListTwo");

现在你可以做

String nameOfFirstList = listOfNames.get(0);

【讨论】:

  • 我想我会顺其自然。谢谢!
【解决方案2】:

除了已经提出的解决方案之外,如果您可以灵活地使用自定义类,您可以创建一个元数据类并将其添加到您的列表中,像这样

public static void main(String[] args) {

    List<String> StringListOne = new ArrayList<>();
    // add values
    List<String> StringListTwo = new ArrayList<>();
    // add values

    List<ListMetadata> metadataList = new ArrayList<>();
    metadataList.add(new ListMetadata("StringListOne", StringListOne));
    metadataList.add(new ListMetadata("StringListTwo", StringListTwo));

    // get first list name
    String firstListName = metadataList.get(0).getName();

    // get list of all names
    List<String> names = metadataList.stream().map(ListMetadata::getName).collect(Collectors.toList());
}

static class ListMetadata {
    String name;
    List<String> value;

    public ListMetadata(String name, List<String> value) {
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public List<String> getValue() {
        return value;
    }
}

这种方法的优点:

  1. 以后可以添加更多元信息。例如count 列表中的项目。
  2. 使用 List 以保留您的广告订单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-24
    • 2010-10-19
    • 2011-02-23
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多