簡體   English   中英

如何在 Java 中將 List 元素放入 String Array

[英]How to put List elements to String Array in Java

有沒有辦法在java中將列表元素放入字符串數組? 我使用自定義比較器按值對 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;
    }

其中記錄是從 csv 文件讀取的數據列表。

這是比較器:

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

        Integer v1 = o1.getValue();

        Integer v2 = o2.getValue();

        return v2.compareTo(v1);
    };

您可以按如下方式獲得鍵數組:

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

在我看來,您錯誤地使用了嵌套 for 循環,您只需要一個:

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

這將返回數組: c, a, b, d

作為附加建議,您還可以使用Entry.comparingByValue()方法創建Comparator器。

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

它返回一個現成的Comparator ,按值的自然順序進行比較。 所以要反向排序,你只需要在Comparator接口中定義的reversed()方法上做標記。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM