当前位置: 代码迷 >> Java Web开发 >> 算法的最优方案
  详细解决方案

算法的最优方案

热度:35   发布时间:2016-04-16 22:17:55.0
求一个算法的最优方案
先看代码:

List<String> list = new ArrayList<String>();
list.add("a");
list.add("a");
list.add("b");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
//现在处理list,把重复的字符串和重复的次数找出来,存入:新的,list2<Map<String,int>();
//最终list2值应该为:
list2.add(HashMap("a",2));
list2.add(HashMap("b",3));

我目前的用的方式貌似很土,看各位大虾有什么好方法
------解决方案--------------------
这个也只能遍历一遍
------解决方案--------------------
算法的话,就是遍历,然后得到Map<String, Integer>
说到这里,想问个问题,我没想明白最后为什么是
List<Map<String, Integer>>
[{a=2},{b=3},{c=1},{d=1},{e=1}]
而不是Map<String, Integer>
{a=2, b=3, c=1, d=1, e=1}

如果是一定要List<Map<String, Integer>>,那就遍历Map<String, Integer>,每个entry 变身成一个map,add到list2里面

P.S.: Map<String, Integer>的最新“高大上”版本
list.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))

------解决方案--------------------

------解决方案--------------------
先往一个HashMap里存,然后再遍历Map找出重复的也就是次数大于1的,基本上还是O(n)吧,只不过比较费空间。。
------解决方案--------------------

List<String> list = new ArrayList<String>();
list.add("a");
list.add("a");
list.add("b");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
//现在处理list,把重复的字符串和重复的次数找出来,存入:新的,list2<Map<String,int>();
//最终list2值应该为:
//list2.add(HashMap("a",2));
//list2.add(HashMap("b",3));
Map map = new HashMap<String, Integer>();
for (int i = 0; i < list.size(); i++) {
String element = list.get(i);
if(map.containsKey(element)){
Integer n = (Integer) map.get(element);
map.put(element, n+1);
}else{
map.put(element, 1);
};
}

Iterator<String> iter = map.keySet().iterator();
while (iter.hasNext()) {
   String key = iter.next();
   Integer value = (Integer) map.get(key);
   System.out.println("key-value:"+key+"-"+value);
}
//如果要得到某个的值
 System.out.println("b的值:"+map.get("b"));
 /*
  * key-value:d-1
key-value:e-1
key-value:b-3
key-value:c-1
key-value:a-2
b的值:3
  * */



------解决方案--------------------
得到新的数据干嘛要存入list,直接存在map里面,拿的时候也方便啊。
------解决方案--------------------
如果只是26个英文字母的话

int[26] t;

for in list
   t[((char)list[i])-'a']++;

for in t 
   if t[i]>1 
     print(i+'a')
     print(t[i]


大概思路就这样,具体代码自己搞吧
------解决方案--------------------
http://hi.baidu.com/752915708/item/6c5d13e67667c63586d9debd
这是我以前发表过的一篇文章 希望可以帮到你
------解决方案--------------------
引用:
如果只是26个英文字母的话

int[26] t;

for in list
   t[((char)list[i])-'a']++;

for in t 
   if t[i]>1 
     print(i+'a')
     print(t[i]


大概思路就这样,具体代码自己搞吧


不明觉厉。就按你说的26个字母,能不能写段代码看看
------解决方案--------------------
引用:
Quote: 引用:

如果只是26个英文字母的话

int[26] t;

for in list
   t[((char)list[i])-'a']++;

for in t 
   if t[i]>1 
     print(i+'a')
     print(t[i]


大概思路就这样,具体代码自己搞吧


不明觉厉。就按你说的26个字母,能不能写段代码看看


	public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("a");
list.add("a");
list.add("b");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
list.add("e");

int[] t = new int[26];

for (String c : list) {
t[c.charAt(0) - 'a']++;
}

for (int i = 0; i < t.length; i++) {
if (t[i] > 1) {
System.err.println((char) (i + 'a') + "==>" + t[i]);
}
}
}



  相关解决方案