簡體   English   中英

根據另一個數組對數組排序

[英]Sorting a Array based on another array

我有2個數組:

第一個由人名組成。 第二個給了我一個頁面上出現的名字數量的計數。 例如:姓名= [“詹姆斯”,“路易伊”,“馬里奧”,“彼得”] count = [1、4、2、5]

現在我嘗試使用下面的代碼:

SortedMap<Integer, String> m = new TreeMap<Integer, String>();
for(int i = 0; i < Names.size(); i++)
        m.put( count.get(i),Names.get(i));

但是,鑒於存在重復的count值,這不起作用。 我發現問題出在TreeMap上,因為它僅存儲唯一元素。 現在要克服我的問題,還有其他有效的解決方案。

創建一個PersonFrequency類,其中包含一個名稱和一個計數。 創建單個數組或PersonFrequency實例列表。 按計數對該數組排序:

Java 8示例:

List<PersonFrequency> list = new ArrayList<>(names.length);
for (int i = 0; i < names.length; i++) {
    list.add(new PersonFrequency(names[i], counts[i]);
}

list.sort(Comparator.comparing(PersonFrequency::getCount).reversed());

List<String> sortedNames = list.stream()
                               .map(PersonFrequency::getName)
                               .collect(Collectors.toList());

在Java 7中,排序將變為

Collections.sort(list, new Comparator<PersonFrequency>() {
    @Override
    public int compare(PersonFrequency p1, PersonFrequency p2) {
        return Integer.compare(p2.getCount(), p1.getCount());
    }
});

按字母順序排序

    String [] names = {"Aaa","Bbb"};
    int [] count = {1,2};

    SortedMap<String, Integer> m = new TreeMap<String, Integer>();

    for(int i = 0; i < names.length; i++){
        m.put(names[i], count[i]);
    }

按數字排序:

    String [] names = {"Aaa","Bbb"};
    int [] count = {2,1};

    SortedMap<Integer, String> m = new TreeMap<Integer, String>();

    for(int i = 0; i < names.length; i++){
        m.put(count[i],names[i]);
    }

對於降序,將已排序的地圖更改為此

SortedMap<Integer, String> m = new TreeMap<Integer, String>().descendingMap();

正如前面的評論中提到的,您可以使用Integer和ArrayList參數對映射進行排序,如下所示,

SortedMap<Integer, ArrayList<String>> map=new TreeMap<Integer, ArrayList<String>>().descendingMap();

由於您希望結果按降序排列,因此我添加了descendingMap()。

我們使用ArrayList,因為您可能在count數組中有重復項。 多個名稱可以具有相同的計數值。 因此,一個計數將具有一個名稱列表。

完整的代碼如下

import java.util.ArrayList;
import java.util.SortedMap;
import java.util.TreeMap;



public class NameCount {

    public static void main(String[] args) {

        String[] names = {"James","Loiui","Mario","Peter"};
        int[] count = {1, 4, 2, 1};

        SortedMap<Integer, ArrayList<String>> map=new TreeMap<Integer, ArrayList<String>>().descendingMap();
        ArrayList<String> nameList=null;

        for(int i = 0; i < names.length; i++)
        {
            if(map.get(count[i])==null)
            {
                nameList = new ArrayList<String>();
                nameList.add(names[i]);
                map.put(count[i], nameList);
            }
            else
            {
                map.get(count[i]).add(names[i]);
            }
        }

        for(int countVal : map.keySet())
        {
            ArrayList<String> namesListVal=map.get(countVal);

            System.out.print("\nCount  "+countVal+ ":  NAMES  : ");
            for(String name : namesListVal)
            {
                System.out.print(name+"  ");
            }

        }
    }

}

暫無
暫無

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

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