求一分组算法

iskyshop 2013-03-21 02:52:25
有一个类EntityField

public class EntityField {
private String fieldName;
private String fieldType;
}

一个List<EntityField> list中有多个EntityField,如下:
EntityField ef1 = new EntityField();
ef1.setFieldName("ef1");
ef1.setFieldType("VARCHAR");
EntityField ef2 = new EntityField();
ef2.setFieldName("ef2");
ef2.setFieldType("LONGTEXT");
EntityField ef3 = new EntityField();
ef3.setFieldName("ef3");
ef3.setFieldType("VARCHAR");
EntityField ef4 = new EntityField();
ef4.setFieldName("ef4");
ef4.setFieldType("VARCHAR");
EntityField ef5 = new EntityField();
ef5.setFieldName("ef5");
ef5.setFieldType("LONGTEXT");
EntityField ef6 = new EntityField();
ef6.setFieldName("ef6");
ef6.setFieldType("VARCHAR");
List<EntityField> list = new ArrayList<EntityField>();
list.add(ef1);
list.add(ef2);
list.add(ef3);
list.add(ef4);
list.add(ef5);
list.add(ef6);

需要将list按照现有的顺序进行分子为多个list,规则如下:
1、每个子list包含1-2个EntityField
2、如果EntityField的fieldType属性值为LONGTEXT则单独放入一个list
上述数组最终分组应该如下:
第一组:ef1、ef3
第二组:ef2
第三组:ef4、ef6
第四组:ef5
...全文
238 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zf0516_mx 2013-03-21
  • 打赏
  • 举报
回复
第一次给的是没考虑 组的划分 第二次的考虑了 上面的代码 nmyangym的也是对的
zf0516_mx 2013-03-21
  • 打赏
  • 举报
回复
List<List<EntityField>> l=new ArrayList<List<EntityField>>();
List<EntityField> li=new ArrayList<EntityField>();
List<EntityField> lis;
int length=0;
for (int i = 0; i < list.size(); i++) {
EntityField ef=list.get(i);
if(ef.getFieldType().equals("LONGTEXT")){
lis=new ArrayList<EntityField>();
lis.add(ef);
length++;
l.add(lis);
}else if(li.size()==1){
li.add(ef);
l.add(l.size()-length,li);
length=0;
li=new ArrayList<EntityField>();
}else{
li.add(ef);
}
}
if(li.size()>0){
l.add(li);
}
for (int i = 0; i < l.size(); i++) {
System.out.print("第"+(i+1)+"组:");
for (int j = 0; j < l.get(i).size(); j++) {
System.out.print(l.get(i).get(j).getFieldName()+" ");
}
System.out.println();
}
dracularking 2013-03-21
  • 打赏
  • 举报
回复
遍历,每两个塞进一个新子List,如果是LongText就单独放,碰到被LongText元素间隔不能成双的非LongText,就将单独塞进一个新子List
zf0516_mx 2013-03-21
  • 打赏
  • 举报
回复
List<List<EntityField>> l=new ArrayList<List<EntityField>>(); List<EntityField> li=new ArrayList<EntityField>(); List<EntityField> lis; for (int i = 0; i < list.size(); i++) { EntityField ef=list.get(i); if(ef.getFieldType().equals("LONGTEXT")){ lis=new ArrayList<EntityField>(); lis.add(ef); l.add(lis); }else if(li.size()==1){ li.add(ef); l.add(li); li=new ArrayList<EntityField>(); }else{ li.add(ef); } } if(li.size()>0){ l.add(li); } for (int i = 0; i < l.size(); i++) { System.out.print("第"+(i+1)+"组:"); for (int j = 0; j < l.get(i).size(); j++) { System.out.print(l.get(i).get(j).getFieldName()+" "); } System.out.println(); }
nmyangym 2013-03-21
  • 打赏
  • 举报
回复
我也写了一个:

import java.util.*;

public class ListGroup{
    public static void main(String[] args){
        List<EntityField> listEntity = initListEntity();
        List<List<EntityField>> list = group(listEntity);
        dispList(list);
    }
    //初始化原始容器内容
    //
    public static List<EntityField> initListEntity(){
        List<EntityField> list1 = new ArrayList<EntityField>();
        EntityField ef1 = new EntityField();
        ef1.setFieldName("ef1");
        ef1.setFieldType("VARCHAR");
        EntityField ef2 = new EntityField();
        ef2.setFieldName("ef2");
        ef2.setFieldType("LONGTEXT");
        EntityField ef3 = new EntityField();
        ef3.setFieldName("ef3");
        ef3.setFieldType("VARCHAR");
        EntityField ef4 = new EntityField();
        ef4.setFieldName("ef4");
        ef4.setFieldType("VARCHAR");
        EntityField ef5 = new EntityField();
        ef5.setFieldName("ef5");
        ef5.setFieldType("LONGTEXT");
        EntityField ef6 = new EntityField();
        ef6.setFieldName("ef6");
        ef6.setFieldType("VARCHAR");

        list1.add(ef1);
        list1.add(ef2);
        list1.add(ef3);
        list1.add(ef4);
        list1.add(ef5);
        list1.add(ef6);
        
        return list1;
    }
    
    //用于分组的代码。
    //
    public static List<List<EntityField>> group(List<EntityField> list2){
        List<List<EntityField>> listOut = new ArrayList<List<EntityField>>();
        //把每个EntityField对象放一个List<EntityField>里,再把每个List<EntityField>
        //放到List<List<EntityField>>里。
        //
        for(EntityField en:list2){
            List<EntityField> listTemp = new ArrayList<EntityField>();
            listTemp.add(en);
            listOut.add(listTemp);
        }
        //遍历List<List<EntityField>>,对于里面的每个List<EntityField>,判断其EntityField
        //内容,如果是LONGTEXT,保留;否则判断是否第一个,第一个保留,记录其位置,查找下一个,
        //找到后,添加到第一个里,之后删除后面这个。注意索引值一定要减一。
        //
        boolean first = false;
        int firstNon_LONGTEXT =0;
        for(int i=0; i<listOut.size(); i++){
            List<EntityField> listTemp = listOut.get(i);
            if(listTemp.get(0).getFieldType().equals("LONGTEXT")){
                continue;
            }else if(first==false){
                firstNon_LONGTEXT = i;//记录第一个非LONGTEXT对象位置。
                first = true;
            }else{
                listOut.get(firstNon_LONGTEXT).add(listOut.remove(i).get(0));
                first = false;
                i--;                  //索引值回退一个。
            }
        }//end for
        return listOut;
    }//end group().
    
    //显示分组后的容器内容
    //
    public static void dispList(List<List<EntityField>> list){
        for(List<EntityField> listEntity:list){
            for(EntityField ef:listEntity){
                System.out.println(ef);
            }
            System.out.println("---------------");
        }
    }
}//end class ListGroup
class EntityField{
    private String fieldName;
    private String fieldType;
    public EntityField(){
    }
    public void setFieldName(String fieldName){
        this.fieldName = fieldName;
    }
    public void setFieldType(String fieldType){
        this.fieldType = fieldType;
    }
    public String getFieldName(){
        return fieldName;
    }
    public String getFieldType(){
        return fieldType;
    }
    public String toString(){
        return fieldName+"  "+  fieldType;
    }
}    
huimiezu 2013-03-21
  • 打赏
  • 举报
回复
private static List<List<EntityField>> toRowChildList(List<EntityField> list) {
        List<List<EntityField>> l = new ArrayList<List<EntityField>>();
        if (list == null)
            return l;
        List cList = new ArrayList();
        for (int i = 0; i < list.size(); i++) {
              EntityField ef1 = list.get(i);
                    if (ef1.getFieldType().equalsIgnoreCase("LONGTEXT")) {
                         cList = new ArrayList();
                        cList.add(ef1);
                        l.add(cList);       
                    }
                   else  if(cList.size()!=2)
                     cList.add(ef1);
                   else  {
                      l.add(cList);
                      cList = new ArrayList();
                    }
        }
       l.add(cList);
       return l;
        
    }
iskyshop 2013-03-21
  • 打赏
  • 举报
回复
自己写了一个,好使,呵呵
iskyshop 2013-03-21
  • 打赏
  • 举报
回复
private static List<List<EntityField>> toRowChildList(List<EntityField> list) {
		List<List<EntityField>> l = new ArrayList<List<EntityField>>();
		if (list == null)
			return l;
		for (int i = 0; i < list.size(); i++) {
			List cList = new ArrayList();
			cList.add(list.get(i));
			l.add(cList);
		}
		for (int i = 0; i < l.size(); i++) {
			List<EntityField> list1 = l.get(i);
			EntityField ef = l.get(i).get(0);
			if (!ef.getFieldType().equalsIgnoreCase("LONGTEXT")) {
				for (int j = i + 1; j < l.size(); j++) {
					EntityField ef1 = l.get(j).get(0);
					if (!ef1.getFieldType().equalsIgnoreCase("LONGTEXT")) {
						list1.add(ef1);
						l.remove(l.get(j));
						break;
					}
				}
			}
		}
		return l;
	}

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧