描述如下比如一个List 里存了"A E B C D C E D" 那么将没有重复元素的A B放进一个HashMap里面
我的程序如下
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.sun.corba.se.impl.encoding.OSFCodeSetRegistry.Entry;public class TestList {
/**
 * @param args
 */
public static void main(String[] args) {
String str="AEBCUCOEDOEDGFHGF";
List alist = new ArrayList();
for(int i=0;i<str.length();i++){
alist.add(str.charAt(i));
}
addListToMap(alist);

}

public static void addListToMap(List list){
int t=0;
Map map = new HashMap();
for(int i=0;i<list.size();i++){
if(map.containsValue(list.get(i))){//先判断从List取出的元素在Map里面是否存在,如果存在则找到删除
List keys = new ArrayList();
Iterator it=map.entrySet().iterator();
while(it.hasNext()){
java.util.Map.Entry ent=(java.util.Map.Entry)it.next();
Object obj = ent.getValue();
if(obj!=null&&obj.equals(list.get(i))){
keys.add(ent.getKey());
}
}
if(map!=null)
for(int s=0;s<keys.size();s++){
map.remove(keys.get(s));
 }
continue;
}

else{//如果从List取出的元素在Map里没有,就放进去
t++;
map.put(new Integer(t), list.get(i));
}
}
for(Iterator it=map.keySet().iterator();it.hasNext();){//遍历Map打印输出
Object key=it.next();
Object value=map.get(key);
System.out.print(value+"  ");
}

}
}

解决方案 »

  1.   

    程序中只能排除偶数重复出现的字母的,如果奇数次重复出现的字母无法排除,比如E,第二次出现后,将它删除了,当第三次出现时,原来的数组里面没有,因此就保留了。if(map!=null)
    for(int s=0;s<keys.size();s++){
    map.remove(keys.get(s));
    }
      

  2.   

    原因LS说了,其实不用那么复杂,其实最开始字符串的时候最好判断了(通过str.replaceAll(str.substring(i, i+1)), '').length() != str.length()-1 判断有没有重复),不知道你为何非要转为list再转为map,不过既然已经这么做了
    这样试试看
    public static void addListToMap(List list){
        int t=0;
        Map map = new HashMap();
        List tmpList = new ArrayList(list);
        List delList = new ArrayList();
        for(int i=tmpList.size()-1;i>=0;i--){
            Object o = tmpList.remove(i); //删除该元素
            if (delList.contains(o) ||  //是否删除过
                  tmpList.contains(o)) {  //是否删除后还有相同的
                delList.add(o);
            } else {
                //map.put(new Integer(++t), o); //这样得到的结果是反过来的,即后面的元素key小
                tmpList.add(o); //如果没有重复的再放回去
            }
        }
        for (int i=0; i<tmpList.size(); i++) {
            map.put(new Integer(++t), tmpList.get(i)); //这样得到的结果是不反的
        }    for(Iterator it=map.keySet().iterator();it.hasNext();){//遍历Map打印输出
            Object key=it.next();
           Object value=map.get(key);
           System.out.print(value+" ");
        }
    }
      

  3.   

    你那个有些长,我写了个,楼主试下: String str="AEBCUCOEDOEDGFHGF";
    Set<Character> result = new HashSet<Character>();
    Map<Character,Integer> map = new HashMap<Character, Integer>();
    for( int i = 0; i < str.length(); i++) {
    Character curChar = Character.valueOf(str.charAt(i));
    if(map.containsKey(curChar)) {
    map.put(curChar,new Integer(map.get(curChar)+1));
    result.remove(curChar);
    }else {
    map.put(curChar,new Integer(1));
    result.add(curChar);
    }
    }
    for (Character character : result) { System.out.print(character);
    }
      

  4.   

    你的结果和LZ的不一样
    如果是通过String直接转为map的,还可以更短
             String str="AEBCUCOEDOEDGFHGF";
            int t=0;
            Map map = new HashMap();
            for(int i = 0; i < str.length(); i++) {
                if (str.length()-1 != str.replaceAll(str.substring(i, i+1), "").length()) {
                    map.put(new Integer(++t), str.charAt(i));
                }
            }
      

  5.   

    首先来说,楼主并没有要求结果要有序(楼主要的结果是HashMap,非同步无序的,和set比较接近),所以,这里用了更快速的set来处理(也可以改成hashMap),如果要有序的,可以把它改成list来实现。
    str.replaceAll这个方法要从开始到结束扫描整个字符串,比较耗资源,str.substring对于取一个char来说,不如charAt,还有,这类题目的都是倾向于原始资源只读一个循环。
      

  6.   

    请问,ArrayUtils好像是commons里的,怎么从String直接转为map?用哪个API?求指教
      

  7.   

    这个方法是不错 
    我就是有个疑问 为什么非要放进去个Integer 呢?
    直接Map<Character,Character>还简单些  呵呵
      

  8.   

    如果都能随便改要求,你又何必要用set和map,直接用两个set不是更好?
    用replaceAll只是针对你的代码长而改的,省代码就有可能会牺牲性能
    另外,如果没有顺序要求,我最开始的那段代码,被注释掉的那句就可以了(前提是根据LZ最开始的要求传进一个list参数的),代码也不比你的长
      

  9.   

    谢谢大家,我昨天晚上发的帖子,不过昨晚基本上已经解决了,我又写了一个代码如下public static void addMap(List list){
    Map map = new HashMap();
    for(int i=0;i<list.size();i++){
    if(map.containsKey(list.get(i))){
    Iterator it=map.entrySet().iterator();
    while(it.hasNext()){
    java.util.Map.Entry ent=(java.util.Map.Entry)it.next();
    Object o = ent.getKey();
    if(o!=null&&o.equals(list.get(i))){
    ent.setValue(1);
    }
    }
    }
    else map.put(list.get(i), 0);
    }
    Map hmap = new HashMap();
    int ht=0;
    for(Iterator it=map.keySet().iterator();it.hasNext();){//遍历Map打印输出
    Object key=it.next();
    Object value=map.get(key);
    if(value.equals(0)){
    ht++;
    hmap.put(ht, key);
    System.out.print(key+"  ");
    }
    }

    }不过还是不够简洁,大家继续讨论啊
      

  10.   

    谢谢,题目就是让你把一个List里面的没有重复的记录放到Hashmap里面,这不是我想把string转换为list