解决方案 »

  1.   

    简单一点 用一个数组HASH已经随机过的ID,每次随机到一个数的时候 判断是否随机过就可以了。ArrayList  randlist = new ArrayList();
    HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();public Object getRandNumber(){
         //随机一个数
        假如是 int num = 343434;   if (!map.containsKey(num)) { //如果没取出就拿出这个数据
               map.put(num,0);
               return num;
       }
        
    }
    提高效率的话 你可以取出一个数据的时候 把数据从list中remove掉 即可都不用判断是否已经取出
    方法有很多
      

  2.   

    您好,我是这样写的,你能帮我看看该怎么改过来么,下面这样肯定还是不行的。 /**
     * 获取随机下标(与当前下标不同)
     * @return
     */
    private ArrayList<Integer> mdlist = new ArrayList<Integer>();
    private int postion = 0;//下标

    private int getRandomNum() {
    int index = 0;
    //先清空集合
    if(mdlist.size()>0){
    mdlist.clear();
    }
    //循环播放列表获取所有歌曲的ID
    for (int i = 0; i < musicList.size(); i++) {
    mdlist.add(musicList.get(i).getId());
    }
    //如果列表只有两首或者一首歌曲
    if (musicList.size() < 2) {
    //index =  mdlist.get(0);
    }else{
    int did = MyApplication.getSharedPreferences();//获取当前播放的歌曲ID
    while (true) {
    index = random();//获取随机数
    if(index != did){
    break;
    }
    }
    }
    //设置当前播放歌曲
    for (int i = 0; i < musicList.size(); i++) {
    if(musicList.get(i).getId()==index){
    MyApplication.saveSharedPreferences(index);
    MyApplication.setCurrentMusic(musicList.get(i));
    break;
    }
    }
    return index;
    }

    /**获取随机歌曲ID*/
    public int random(){
    postion = random.nextInt(mdlist.size());//根据集合的size来设置随机范围
    return mdlist.get(postion);//返回随机歌曲ID
    }
      

  3.   


    private ArrayList<Integer> mdlist = new ArrayList<Integer>();
    private int postion = 0;//下标
    HashMap<Integer,Integer> historyMap= new  HashMap<Integer,Integer>();private int getRandomNum() {
        int index = 0;
        //先清空集合
        if(mdlist.size()>0){
            mdlist.clear();
        }    //循环播放列表获取所有歌曲的ID
        for (int i = 0; i < musicList.size(); i++) {
            mdlist.add(musicList.get(i).getId());
        }    //如果都取完了,重置一下
        if (historyMap.size() == mdlist.size()) {
                 historyMap.clear();
        }
        //如果列表只有两首或者一首歌曲
        if (musicList.size() < 2) {
            //index =  mdlist.get(0);
        }else{
            int did = MyApplication.getSharedPreferences();//获取当前播放的歌曲ID
            while (true) {
                index = random();//获取随机数
                if (!historyMap.containsKey(index)) {
                      historyMap.put(index ,index );
                      break;
                }
              //  if(index != did){
              //      break;
             //   }
            }
        }
        //设置当前播放歌曲
        for (int i = 0; i < musicList.size(); i++) {
            if(musicList.get(i).getId()==index){
                MyApplication.saveSharedPreferences(index);
                MyApplication.setCurrentMusic(musicList.get(i));
                break;
            }
        }
       
        return index;
    }
     
    /**获取随机歌曲ID*/
    public int random(){
        postion = random.nextInt(mdlist.size());//根据集合的size来设置随机范围
        return mdlist.get(postion);//返回随机歌曲ID
    }你试试吧
      

  4.   


    不行,还是会有重复,这里有几点比较重要的:
    1,播放列表是贯穿整个项目的,假设现在的播放列表是专辑的,如果我换了歌手的歌曲,那么播放列表就会变成是歌手的。所以mdlist的集合就要清空,重新循环获取播放列表的歌曲ID来进行随机。
    2、如果没有切换歌手或者专辑等等,那么mdlist的数据就不变,但是就要进行移除已经被随机过的歌曲ID,避免重复随机。同时把移除的歌曲ID添加到一个新的集合里面,直到mdlist的数据都移除完了,再重新把新的集合导入mdlist里,再进行随机。
      

  5.   

    执着的妹子么,你来这里问题其实也就是百度算法嘛,本质没区别,你还不如百度,思路是这样,从一堆数组里面拿出一个数判断hashset里面是否有,没有就存入hashset,直到hashset的size和之前的一样,不过这样的算法冗余度较长