在实际工作中,有很多时候我们传到后台的参数是一个不含主键的字符串(也有可能是其他表的ID),需要分割字符串后对比原有数据进行增加、修改或删除。比如原来的有A/B/C三条记录,现在修改为A/B/D/E四条记录,这就需要先做对比,删除C记录,增加D/E记录。当然你也可以直接将原有记录直接全部删除,然后再添加新的,但这种做法不提倡,有一定的风险,如果别的地方引用到了原来的id,那就会出现找不到的问题。
一个实例:
上图就是一个对子标签进行增、删、改的需求。
还有诸如权限的勾选等需求。
现在模拟一个需求:
* 需求:根据非主键增、删(此处为软删除,即改变记录状态为删除状态)多条记录
* 数据库结构如下:(此处假如状态1为有效,2为删除)
*
* 原记录
* id(主键) name(名称) sort(排序) state(状态)
* 1 热干面 1 1
* 2 煎包 2 1
* 3 豆皮 3 1
* 4 面窝 4 1
*
* 新记录
* id(主键) name(名称) sort(排序) state(状态)
* 1 热干面 1 1
* 2 煎包 2 2
* 3 豆皮 3 1
* 4 面窝 4 2
* 5 稀饭 4 1
*
* 注意:1,原有记录不能直接删除,因为删除后,如果其他地方有引用到该id,则会造成查询不到的异常。
* 【直接删除原有记录是最简单实现该需求的方式,如果其他地方不会引用到id,或者记录是固定的几种,可以直接删除】
* 【实现该需求,只需要得到两个集合即可:一个是新的要添加的记录的集合,即新增集合;另一个是要删除(修改状态的集合),即修改集合】
* 2,在循环比较中单个update可以达到效果,但在生产环境中风险较大。最好是比较完成后将集合传给持久层框架。
思路:1,将新旧字符串转换成两个集合,视具体是否需要有序、重复选择ArrayList或HashSet,这里笔者用两种方法分别使用ArrayList和HashSet. 2,对比两个集合,返回一个需要增加的集合,返回一个需要修改(删除)的集合。
两种方法效果一样:
第一种方法:一一判断,一一添加、修改
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
class ModifyMultipleDemo
{
public static void main(String[] args)
{
//原有记录
String oldRecord="热干面/煎包/豆皮/面窝";
//新记录
String newRecord="热干面/豆皮/稀饭";
//新增集合
List<String> insertList=getInsertList(oldRecord,newRecord);
//删除(修改)集合
List<String> deleteList=getDeleteList(oldRecord,newRecord);
//转换集合
String insertStr=listToString(insertList);
String deleteStr=listToString(deleteList);
System.out.println("原有记录:"+oldRecord);
System.out.println("新记录:"+newRecord);
System.out.println("新的要添加的记录:"+insertStr);
System.out.println("旧的要删除的记录:"+deleteStr);
}
/**
* 将集合转换成字符串
*/
private static String listToString(List<String> list)
{
StringBuilder stringBuilder=new StringBuilder("[");
/*for(int i=0;i<list.size();i++)
{
if(i!=list.size()-1) stringBuilder.append(list.get(i)+" ");
else stringBuilder.append(list.get(i));
}*/
Iterator<String> iterator=list.iterator();
while(iterator.hasNext())
{
stringBuilder.append(iterator.next()+" ");
}
stringBuilder.append("]");
String str=stringBuilder.toString();
int index=str.lastIndexOf(" ");
if(index!=-1) return str.substring(0,index).concat(str.substring(index+1));
else return str;
//return stringBuilder.toString();
}
/**
* 新增集合
*/
private static List<String> getInsertList(String oldRecord,String newRecord)
{
List<String> insertList=new ArrayList<String>();
String[] oldRecordArray=oldRecord.split("/");
String[] newRecordArray=newRecord.split("/");
insert:for(String outNew:newRecordArray)
{
boolean b=false;
for(String inOld:oldRecordArray)
{
if(outNew.equals(inOld))
{//不需要修改
b=false;
//continue insert;//结束本次外层循环
break;//结束内层循环
}else{//需要修改
b=true;
}
}
if(b)
{
insertList.add(outNew);
}
}
return insertList;
}
/**
* 删除(修改)集合
*/
private static List<String> getDeleteList(String oldRecord,String newRecord)
{
List<String> deleteList=new ArrayList<String>();
String[] oldRecordArray=oldRecord.split("/");
String[] newRecordArray=newRecord.split("/");
delete:for(String outOld:oldRecordArray)
{
boolean flag=false;
for(String inNew:newRecordArray)
{
if(outOld.equals(inNew))
{//不能删除
flag=false;
//break;//结束内层循环
continue delete;//结束本次外层循环
}else{//需要删除原有的
flag=true;
}
}
if(flag)
{
deleteList.add(outOld);
}
}
return deleteList;
}
}
第二种方法:使用父接口collection提供的retainAll(),addAll(),removeAll()方法实现,该方法直接调用方法,比较好理解
import java.util.Iterator;
import java.util.HashSet;
class ModifyMultipleDemo
{
public static void main(String[] args)
{
//原有记录
String oldRecord="热干面/煎包/豆皮/面窝";
//新记录
String newRecord="热干面/豆皮/稀饭";
//新增集合
HashSet<String> insertSet=getInsertSet(oldRecord,newRecord);
//删除(修改)集合
HashSet<String> deleteSet=getDeleteSet(oldRecord,newRecord);
//转换集合
String insertStr=setToString(insertSet);
String deleteStr=setToString(deleteSet);
System.out.println("原有记录:"+oldRecord);
System.out.println("新记录:"+newRecord);
System.out.println("新的要添加的记录:"+insertStr);
System.out.println("旧的要删除的记录:"+deleteStr);
}
/**
* 将集合转换成字符串
*/
private static String setToString(HashSet<String> set)
{
StringBuilder stringBuilder=new StringBuilder("[");
/*for(int i=0;i<list.size();i++)
{
if(i!=list.size()-1) stringBuilder.append(list.get(i)+" ");
else stringBuilder.append(list.get(i));
}*/
Iterator<String> iterator=set.iterator();
while(iterator.hasNext())
{
stringBuilder.append(iterator.next()+" ");
}
stringBuilder.append("]");
String str=stringBuilder.toString();
int index=str.lastIndexOf(" ");
if(index!=-1) return str.substring(0,index).concat(str.substring(index+1));
else return str;
//return stringBuilder.toString();
}
/**
* 新增集合
*/
private static HashSet<String> getInsertSet(String oldRecord,String newRecord)
{
HashSet<String> insertSet=new HashSet<String>();
HashSet<String> oldSet=new HashSet<String>();
HashSet<String> newSet=new HashSet<String>();
String[] oldRecordArray=oldRecord.split("/");
String[] newRecordArray=newRecord.split("/");
for(String oldStr:oldRecordArray)
{
oldSet.add(oldStr);
}
for(String newStr:newRecordArray)
{
newSet.add(newStr);
}
//将所有新的赋给将要返回的集合
insertSet.addAll(newSet);
//取二者之交集,赋给newSet
newSet.retainAll(oldSet);
//移除已有的记录,剩下新增的
insertSet.removeAll(newSet);
return insertSet;
}
/**
* 删除(修改)集合
*/
private static HashSet<String> getDeleteSet(String oldRecord,String newRecord)
{
HashSet<String> oldSet=new HashSet<String>();
HashSet<String> newSet=new HashSet<String>();
String[] oldRecordArray=oldRecord.split("/");
String[] newRecordArray=newRecord.split("/");
for(String oldStr:oldRecordArray)
{
oldSet.add(oldStr);
}
for(String newStr:newRecordArray)
{
newSet.add(newStr);
}
//取二者之交集
newSet.retainAll(oldSet);
//移除旧集合已有的
oldSet.removeAll(newSet);
return oldSet;
}
}
以上代码均可直接编译运行。