问题是这样的:我oracle中有张user表:
user表中有一个字段hobby:
其中hobby字段的值都是这样的格式的:数据一:读书-交友-游戏-时尚-篮球-逛街-滑雪-音乐-舞蹈-摄影-旅游-宠物-棋牌-溜冰-文学-书画-影视-饮食-乒乓-电脑-游泳数据二:读书-交友-摔跤-旅游-棋牌-健美-文学-书画-影视-游泳数据三:读书-交友-摔跤-摄影-旅游-棋牌-健美-溜冰-文学-书画-影视-游泳我现在要得到的效果是:比较两个数据,得到他们中 “爱好” 的匹配个数。请教下效率好点的算法。

解决方案 »

  1.   

    我不知道你这个项目具体的业务。我可能会建一张 UserHobby 表,基本上是这样的结构:T_USER_HOBBY
    -----------------------------------
    ID          NUMBER(9)        PK
    USERNAME    VARCHAR2(50)     用户名,或者存 USER 表的主键
    HOBBY       VARCHAR2(50)     用户的一个爱好总之具体要看具体业务逻辑需要了
      

  2.   

    一个自认为有效的办法
    将所有有可能用到的爱好做成一个数组并用一个int[]数组的下标来表示爱好
    读书-0
    交友-1
    游戏-2
    时尚-3
    篮球-4
    逛街-5
    滑雪-6
    音乐-7
    舞蹈-8
    摄影-9
    旅游-10
    宠物-11
    棋牌-12
    溜冰-13
    文学-14
    书画-15
    影视-16
    饮食-17
    乒乓-18
    电脑-19
    游泳-20
    摔跤-21
    健美-22
    溜冰-23
    假设这个已经囊括了项目所用到的所有爱好
    数据二(假设)1,3,4,5,7,8,9,10,12,15
    数据三(假设)1,2,3,4,5,6,7,8,9,10
    现在用一个临时int数组来保存数据二和数据三
    int[] temp = new int[]{1,3,4,5,7,8,9,10,12,15,1,2,3,4,5,6,7,8,9,10};
    Arrays.sort(temp);
    int count=0;
    for(int i=0; i<temp.length-2;) {
        if(temp[i]==temp[i+1]) {
            count++;
            i+=2;
        }else {
            i++;
        }
    }
    count就是数据二和数据三的匹配数了
      

  3.   


    int[] temp = new int[]{1,3,4,5,7,8,9,10,12,15,1,2,3,4,5,6,7,8,9,10}; 
    Arrays.sort(temp); 
    int count=0; 
    for(int i=0; i <=temp.length-2;) { //i<=temp.length-2;
        if(temp[i]==temp[i+1]) { 
            count++; 
            i+=2; 
        }else { 
            i++; 
        } 
    }
      

  4.   


    Arrays.sort(temp);兄弟,这个临时int数组已经排序过了,如果有匹配的,那么肯定是有连两个相同的相邻的并且不可能出现三个以及更多的相邻
    如果当前元素和挨着的靠后的元素相等,说明找到一个匹配,count++;游标向后走两位
    如果当前元素和挨着的靠后的元素相等,说明当前不匹配,游标向后走一位
    遍历到倒数第二个元素后判断完,结束
    应该可以的吧,如有不当,多多指教
      

  5.   

    谢谢大家的回复。
    冬子的算法给了我思路,只是不需要把字符串数组转换成 int数组,一样可以比较,Collections.sort(String数组)可以排序,其实排序的主要作用是将相同的相邻。另外我现在也重新设计了表,谢谢果子前辈。^_^