Search code examples
javagroovyhashmap

I would like to regroup records thats have a logical suit together


Hi so i'm trying to make Something like this :

id:1  First: -9999 Last: -9999 group: B 
id:2  First: -9999 Last: -9999 group: B 
id:3  First: 1 Last: 2 group: 0 
id:4  First: 2 Last: 3 group: 0 
id:5  First: 3 Last: 4 group: 0 
id:6  First: 6 Last: 7 group: 1 
id:7  First: 7 Last: 8 group: 1 
id:8  First: 8 Last: 9 group: 1
id:9  First: 9 Last: 10 group: 1
id:10  First: 99 Last: 100 group: 2 
id:11  First: 100 Last: 101 group: 2
id:12  First: 101 Last: 102 group: 2 
id:13  First: 201 Last: 200 group: 3 

unfortunately for the moment i get this :

id:1  First: -9999 Last: -9999 group: B 
id:2  First: -9999 Last: -9999 group: B 
id:3  First: 1 Last: 2 group: 0 
id:4  First: 2 Last: 3 group: 1 
id:5  First: 3 Last: 4 group: 1 
id:6  First: 6 Last: 7 group: 2 
id:7  First: 7 Last: 8 group: 3 
id:8  First: 8 Last: 9 group: 3 
id:9  First: -9998 Last: -9998 group: B 
id:10  First: 99 Last: 100 group: 4 
id:11  First: 100 Last: 101 group: 5 
id:12  First: 101 Last: 102 group: 5 
id:13  First: 201 Last: 200 group: null

If anyone can help me with this , it will be very appreciate

data= [[OUT_FID_R2:-9999, OBJECTID_R2:1, IN_FID_R2:-9999], [OUT_FID_R2:-9999, OBJECTID_R2:2, IN_FID_R2:-9999], [OUT_FID_R2:2,OBJECTID_R2:3, IN_FID_R2:1], [OUT_FID_R2:3, OBJECTID_R2:4, IN_FID_R2:2], [OUT_FID_R2:4, OBJECTID_R2:5, IN_FID_R2:3], [OUT_FID_R2:7, OBJECTID_R2:6, IN_FID_R2:6], [OUT_FID_R2:8, OBJECTID_R2:7, IN_FID_R2:7], [OUT_FID_R2:9, OBJECTID_R2:8, IN_FID_R2:8],[OUT_FID_R2:-9998, OBJECTID_R2:9, IN_FID_R2:-9998],[OUT_FID_R2:100, OBJECTID_R2:10, IN_FID_R2:99], [OUT_FID_R2:101, OBJECTID_R2:11, IN_FID_R2:100], [OUT_FID_R2:102, OBJECTID_R2:12, IN_FID_R2:101], [OUT_FID_R2:200, OBJECTID_R2:13, IN_FID_R2:201]]  

  
data=data.unique()
    int cle=0
    for (int x=0; x<data.size();x++) {
        for (int j=0; j<data.size();j++){
            if(data[x]['IN_FID_R2']!= data[x]['OUT_FID_R2']){
                if(data[x]['OUT_FID_R2']==data[j]['IN_FID_R2']){
                    data[x].put('new_grp',cle)
                    data[j].put('new_grp',cle)
                    cle++
                }
            }     
            else{
                data[x].put('new_grp','B')
                }
        }
    }
    for (int i=0; i<data.size();i++){
        printf("id:%s  First: %s Last: %s group: %s \n",data[i]['OBJECTID_R2'],data[i]['IN_FID_R2'], data[i]['OUT_FID_R2'],data[i]['new_grp'])
    }

So for the moment after my first condition is found the group start at 0 but the one after start at 1 and it should keep the group as 0 since the last(id:3) and first(id:4) are the same and it seem that the group happen for 2 records only.


Solution

  • I looked at your solution and you were on a good track. The only correction will be in your assignation of a new value once the sequential range is found. Here my answer :

    int cle =0
    for (int x=0; x<data.size();x++) {
        for (int j=0; j<data.size();j++){
            if(data[x]['IN_FID_R2']!= data[x]['OUT_FID_R2']){
                if(data[x]['OUT_FID_R2']==data[j]['IN_FID_R2']){
    
                    if (data[x]['new_grp'] ==null && data[x]['new_grp'] ==null ){
                        
                        data[x].put('new_grp',[cle])
                        data[j].put('new_grp',[cle])
    
                        
                    }else if (data[x]['new_grp'] ==null || data[j]['new_grp'] ==null ){
    
                        respond= data[x]['new_grp']+data[j]['new_grp']
                        
                        data[x].put('new_grp',respond.findAll{it != null})
                        
                        data[j].put('new_grp',respond.findAll{it != null})      
    
                    }
                         
                    cle++
                }
            }     
            else{
                data[x].put('new_grp','B')
                }
        }
    
    }
    

    The expected result will be :

    id:1  First: -9999 Last: -9999 group: B 
    id:2  First: -9999 Last: -9999 group: B 
    id:3  First: 1 Last: 2 group: [0] 
    id:4  First: 2 Last: 3 group: [0] 
    id:5  First: 3 Last: 4 group: [0] 
    id:6  First: 6 Last: 7 group: [2] 
    id:7  First: 7 Last: 8 group: [2] 
    id:8  First: 8 Last: 9 group: [2] 
    id:9  First: -9998 Last: -9998 group: B 
    id:10  First: 99 Last: 100 group: [4] 
    id:11  First: 100 Last: 101 group: [4] 
    id:12  First: 101 Last: 102 group: [4] 
    id:13  First: 102 Last: 200 group: [4]