2014-05-05 249 views
0

我有2个阵列:基于另一个阵列排序阵列

第一个由人名组成。第二个给我一个页面中出现的名字的数量。 例如:名称= “詹姆斯”, “Loiui”, “马里奥”, “彼得”] 数= [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)); 

但是这不工作,因为有重复的计数值。我发现问题出在TreeMap上,因为它只存储唯一的元素。现在为了解决我的问题,是否还有其他有效的解决方案。

+1

名称可能是唯一的,所以你应该使用'的SortedMap <字符串,整数>'。但是,如果您的目标是按计数排序,请使用'SortedMap >'。 –

+0

但我希望最终结果按照计数降序排列,即首先出现的重复名称 – kiran

+0

然后,您可以使用'SortedMap <整数,列表>',正如我所说的那样。 –

回答

0

按字母顺序排序

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(); 
+0

同意!但我想要根据计数值的数量对结果结果进行排序。而不是按字母顺序! – kiran

+0

你走了!我编辑 – DavideBar

3

创建一个类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()); 
    } 
}); 
+0

可否请您详细说明。 – kiran

+0

详述一下?示例代码是否足够容易理解? –

+0

有什么办法可以将PersonFrequency List应用到java 1.7中? – kiran

0

正如在以前的评论中提到,你可以有整数有序映射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+" "); 
      } 

     } 
    } 

}