【问题标题】:How to put List elements to String Array in Java如何在 Java 中将 List 元素放入 String Array
【发布时间】:2020-06-28 19:30:18
【问题描述】:

有没有办法将列表元素放入 java 中的 String 数组?我使用自定义比较器按值对 Map 进行排序,现在尝试将 key(String) 元素放入数组中。我发现的唯一方法是同时遍历数组和排序列表并以这种方式填充数组,但它只将最后一个元素放入其中。

示例: 我的地图没有排序:{a=5, b=2, c=8, d=1}

使用自定义比较器排序后:[c=8, a=5, b=2, d=1]

现在我只需要将键值(c,a 等)放入元组 final String[] lettersWithBigValues = new String[n],其中 n 是元组的长度。

但是,之后:

for (int i = 0; i < Integer.parseInt(args[1]); i++) { System.out.println(lettersWithBigValues[i]+","); }

控制台返回: d,d,d,d 假设控制台行参数是 4

这是完整的功能:

public String[] getTopLettersWithValues(final int n){
        final String[] lettersWithBigValues = new String[n];

        final Map<String, Integer> myMap = new HashMap<>();

        int counter = 0;

        for (final List<String> record : records) {

            if (!myMap.containsKey(record.get(1))) {
                myMap.put(record.get(1), counter += Integer.parseInt(record.get(4)));
            } else {
                myMap.computeIfPresent(record.get(1), (k,v) -> v + Integer.parseInt(record.get(4)));
            }
        }

        System.out.println(myMap);

        List<Map.Entry<String, Integer>> sorted = new LinkedList<>(myMap.entrySet());

        // Sort list with list.sort(), using a custom Comparator
        sorted.sort(valueComparator);

        System.out.println(sorted);

        for (int i = 0; i < lettersWithBigValues.length; i++) {
            for (Map.Entry<String, Integer> values: sorted) {
                lettersWithBigValues[i] = values.getKey();
            }
        }
         return lettersWithBigValues;
    }

其中 records 是从 csv 文件中读取的数据列表。

这里是比较器:

    public Comparator<Map.Entry<String, Integer>> valueComparator = (o1, o2) -> {

        Integer v1 = o1.getValue();

        Integer v2 = o2.getValue();

        return v2.compareTo(v1);
    };

【问题讨论】:

  • 检查这是否回答了您的问题:stackoverflow.com/questions/16203880/get-array-of-maps-keys
  • 如果您的输入映射中有奇数个条目,那么您将如何形成元组?你的预期输出是什么?
  • @Naman 奇数条目永远不会出现,因为它们是从 csv 文件中读取的。我的预期输出是一个字符串元组,其中包含排序列表中的所有键值(但据我所知,列表没有键值)。但不知何故,我仍然能够将 d 放入元组中,这就是我不太了解的。
  • @DanielBenedek 您需要共享从输入映射到排序映射的转换中使用的代码,以便进一步说明。
  • @Naman 我更新了上面的链接,请看一下

标签: java arrays list sorting comparison


【解决方案1】:

您可以按如下方式获得键数组:

String [] lettersWithBigValues = myMap.entrySet().stream() // entries of your intial map
        .sorted(valueComparator) // sorted by your comparator
        .map(Map.Entry::getKey) // mapped to only the key e.g. 'd', 'a'
        .toArray(String[]::new); // converted to array

【讨论】:

  • 感谢它帮助解决了问题!
【解决方案2】:

在我看来,您错误地使用了嵌套 for 循环,您只需要一个:

for (int i = 0; i < lettersWithBigValues.length; i++) {
     lettersWithBigValues[i] = sorted.get(i).getKey();
}

这将返回数组:c, a, b, d

【讨论】:

    【解决方案3】:

    作为补充建议,您还可以使用Entry.comparingByValue() 方法创建Comparator

    Comparator<Entry<String,Integer>> valueComparator = 
                    Entry.<String,Integer>comparingByValue().reversed();
    

    它返回一个现成的Comparator,按值的自然顺序进行比较。所以要反向排序,你只需要在Comparator接口中定义的reversed()方法上打标签。

    【讨论】:

      猜你喜欢
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多