假如有一个ArrayList,或者Array里边有几组数据,都是字符串形式存放的。
例如:11,22,“”,22,“”,33,“”,11,44
最后得到一个al或者array是:
11,22,33,44具体的要求是:
获得第一个对象时,然后开始找,后边是否有相同的对象。如果后边存在相同的对象,那么后边相同的的对象,替换前边相同的对象,这样反复。如果对象是null或者“”,不要。本来我想了几个方法,但是都有缺陷。
现在脑子绕不过来了,请大家也想想。一句话就是,同样是相同的对象,最后一个会最终把前边一样的都替换掉,只留最后这一个对象。
例如:11,22,“”,22,“”,33,“”,11,44
最后得到一个al或者array是:
11,22,33,44具体的要求是:
获得第一个对象时,然后开始找,后边是否有相同的对象。如果后边存在相同的对象,那么后边相同的的对象,替换前边相同的对象,这样反复。如果对象是null或者“”,不要。本来我想了几个方法,但是都有缺陷。
现在脑子绕不过来了,请大家也想想。一句话就是,同样是相同的对象,最后一个会最终把前边一样的都替换掉,只留最后这一个对象。
解决方案 »
- JFrame中可用setImage()方法设置图标,怎么能实现一个方法设置程序开发时所有出现的JFrame?
- 关于 java -version的问题!
- 给1个按钮添加包含匿名内部类的监听器
- 如何在编译时把外JAR包的内容包含进去
- integer转化成string,哪种方法权威?
- java中如何实现在忙操作时鼠标变为漏斗状
- throw and throws
- 请问 如何在一个html文件中嵌入另一个html文件
- 统计一下有多少商用软件用Java开发或者将要用Java开发
- java继承的私有属性能不能继承给子类
- fileContent += br.readLine();这样写对吗??
- 方法中有参和无参的区别?
List<String> list = new ArrayList<String>();
list.add("11");
list.add("22");
list.add("");
list.add("22");
list.add("");
list.add("33");
list.add("");
list.add("11");
list.add("44"); List<String> result = new ArrayList<String>();
while(list.size() > 0) {
String s = list.remove(0); if(s != null && !"".equals(s) && !list.contains(s)) {
result.add(s);
}
} System.err.println(java.util.Arrays.toString(result.toArray()));
list.add("22");
list.add("");
list.add("22");
list.add("");
list.add("33");
list.add("");
list.add("11");
list.add("44");
拿这个举例也行。我想要的过程是,取出第一个对象,后边开始比较。如果后边有空的,就直接去掉。如果有一样的,就把这个第一个对象替换掉,替换之后,这个对象也删除。这样下来,到最后,就只有不一样的对象存在了。
list1.add("11");
list1.add("22");
list1.add("33");
list1.add("55");List<String> list2 = new ArrayList<String>();
list2.add("22");
list2.add("33");
list2.add("66");for (String s : list2)
{
if (list1.contains(s))
list1.remove(s);
}for (String s : list1)
{
System.out.println(s);
}
list.add("11");
list.add("22");
list.add("");
list.add("22");
list.add("");
list.add("33");
list.add("");
list.add("11");
list.add("44");List<String> listRst = new ArrayList<String>();
for (String s : list) {
if (!listRst.contains(s) && !s.equals(""))
listRst.add(s);
}
for (String s : listRst) {
System.out.println(s);
}
1.遍历ArrayList表,找出有效的对象,取出这个对象的key
2,去数据库寻找这个key
3.如果找到,就更新它
第二步,第三步其实可以用一条SQL语句了 update ... where ...另外你没有提及这种情况,就是ArrayList存在有效对象,但是数据库却不存在。
假如会出现这种情况,而你又想把它插入到数据库,第二第三步不能直接用一条sql语句了,
你要根据Try..catch是否查询成功,决定是更新她还是插入它此外如果插入数据库的过程会严重影响效率时 你可以对ArrayList从后向前遍历,
如果找到了已经遍历过的对象,那么你可以remove(Object o)它,,同时你可以剔除无效对象
这里说起来轻松,但也要两重循环。
所以你可以从前往后扫描ArrayList并把有效对象放入HashSet,只要你实现comparator, HashSet自动会吧相同的对象替换掉
说到这里,又可以考虑一下,你以前的代码是否设计合理,反正最新对象都会取代旧对象,当初为什么不直接使用HashSet或LinkHashSet,而使用麻烦的ArrayList
什么意思啊?
那么开始比较:谁与谁比较?
比较主键:哪来的主键?表中主键还用比较?根本不可能相同
AL中值一样,就更新一下表:更新成什么样?
最后一个问题 :AL到底是什么意思:ArrayList ?
在页面有像数据库表的那样形式的输入。页面是有几行输入框,每行都有10多个输入值。最后存入到数据库。程序本来写的是存储过程,直接插入数据库。插入报错就用更新的方式来插入数据。因为每行某几个输入值,对应的是数据库表中的主键。所以,主键有重复的数据的话,那么插入肯定会出错。这样,就更新就行了。数据库中做的话,是比较容易的。当下条数据插入时,主键冲突,那么下条数据更新上一条冲突的数据就完了。但是现在我想拿到页面上来做,先用java端判定输入情况,这样能比在数据库中性能要高吧。所以在java端,就得实现一个逻辑(每一行的第一个输入项为主键):
第一行和后边几行比较,依次进行判断。如果后一条的主键值和第一行的值一样,那么数据就应该是后边的这行,遇到后边有输入项为“”的,就不要这行数据。一直判断到最后,然后第二行的值开始继续往后比较。。依此类推,直到最后一个数据。就是只要有一样主键值的最后一条数据。所以,程序最后是,相同输入项的行数,只有一条(只拿每行输入的第一个值当主键就好了),输入项没值的,就不要。然后,这个时候,直接把所有的数据,就插入到数据库中就行了,都是唯一值。呵呵。就是这样。ps。1,AL是ArrayList。我这里说的主键,是把页面的某一项输入值说成是数据库中的主键,这样容易理解。
我现在用hashmap写出来了,不知道性能咋样。2个hashmap实现的。