我先在这里说一下目前在做的这样一个功能:
读取以下内容类似的一个文件,然后通过=号分割,将分割后的值前面一部分以及后面一部分放在map里面,后添加到了一个List里面。
现在我是想要把这个读取后添加的List拿出来进行比较,通过取里面map的key来进行比较:如果是相同的,那就将val拿出来放到另外一个map里面,进行入库。
1.3.6.1.2.1.1.2.0 = 1.3.6.1.4.1.9.12.3.1.3.411
1.3.6.1.2.1.1.3.0 = 173 days, 10:36:40.88
1.3.6.1.2.1.1.4.0 =
1.3.6.1.2.1.1.5.0 = mds9140-h02-n18-1
1.3.6.1.2.1.1.6.0 =
1.3.6.1.2.1.1.7.0 = 70
1.3.6.1.2.1.2.2.1.1.16777216 = 16777216
1.3.6.1.2.1.2.2.1.1.16781312 = 16781312
1.3.6.1.2.1.2.2.1.1.16785408 = 16785408
以下是我读取的代码:
List fileList = getFileList();
List list = new ArrayList();
for (Object object : fileList) {
Map valMap = new HashMap();
Map map = (Map)object;
String key = map.keySet().toString();
String val = map.values().toString();
val.replaceAll(" ", "");
if(val!=null ){
if(key.contains("1.3.6.1.2.1.1.5")){
valMap.put("Name", val);
}else if(key.contains("1.3.6.1.2.1.2.1")){
valMap.put("portnumber", val);
}else if(key.contains("1.3.6.1.2.1.2.2.1.1")){
valMap.put("portindex", val);
}else if(key.contains("1.3.6.1.2.1.31.1.1.1.1")){
valMap.put("portfcvalue", val);
}else if(key.contains("1.3.6.1.2.1.2.2.1.3")){
valMap.put("porttype", val);
}
if(valMap != null && valMap.size()>0){
list.add(valMap);
}
}
}
我写的这段代码,在匹配1.3.6.1.2.1.2.2.1.1 的时候回匹配到很多个,匹配的字符不止我写的这几个,还有很多,想请问下有没有什么简便方法用来比较字符后进行入库操作,还望大神指教,谢谢!!!
package a;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
public class A {
/** 文件的一行记录为一个对象 */
public class Line {
public String key;
public String val;
public Line() {}
public Line(String key, String val) {
this.key = key;
this.val = val;
}
}
@Test
public void test() {
//逐行读取文件, 每行保存为一个map(或者保存为一个对象), 读取文件的步骤省略, 以下为模拟读取文件过程
//第一行
Line line1 = new Line("a", "1");
//第二行
Line line2 = new Line("b", "2");
//第三行
Line line3 = new Line("a", "3");
//第四行
Line line4 = new Line("b", "4");
//第五行
Line line5 = new Line("a", "5");
//文件内容
List<Line> fileContent = new ArrayList<Line>();
fileContent.add(line1);
fileContent.add(line2);
fileContent.add(line3);
fileContent.add(line4);
fileContent.add(line5);
//模拟读取文件并存入集合结束
//处理结果
Map<String, List<String>> result = new HashMap<String, List<String>>();
//处理过程
for (Line line: fileContent) {
//当前行的key
String key = line.key;
//结果中已经存在的key集合
Set<String> keys = result.keySet();
if (key!=null && !"".equals(key)) {
//开关
boolean flag = false;
for (String k: keys) {
if (key.equals(k)) {
flag = true;
break;
}
}
if (flag) {//如果结果中存在相同的key, 将这一行的val添加到集合
result.get(key).add(line.val);
} else {//否则新建一个键值对
List<String> list = new ArrayList<String>();
list.add(line.val);
result.put(key, list);
}
}
}
System.out.println("处理结果" + result);
}
}
控制台输出:处理结果{b=[2, 4], a=[1, 3, 5]}
楼主看看是否符合你的需求
出现你这种情况很正常啊,你先要搞清楚contains的定义,它是指前面的字符串包含后面的字符串就返回true,反之false,如果一个key包含1.3.6.1.2.1.2.2.1.1,那么它必然也包含1.3.6.1.2.1.2.1这样不就多添加了吗。
package test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
@此类的作用
*/
public class Test {
public static void main(String[] args){
try {
copyFileUsingFileStreams("D:/eclipse/1.txt");
} catch (IOException e) {
e.printStackTrace();
}
}
private static void copyFileUsingFileStreams(String path)
throws IOException {
InputStream input = null;
InputStreamReader inputRead=null;
BufferedReader read=null;
String line="";//读取的每行数据
Map map=new HashMap();
try {
input = new FileInputStream(new File(path));//字节流
inputRead=new InputStreamReader(input);//字节流通向字符流的桥梁
read = new BufferedReader(inputRead);//字符流
while ((line=read.readLine())!= null) {//每次读取一行且读取的内容不为null
map=getAllMap(map, line);//递归添加
}
List> list = getAllList(map);
for (int i = 0,len=list.size(); i < len; i++) {
//遍历map
}
} finally {
input.close();
}
}
private static Map getAllMap(Map map,String line){
String[] strs = line.split("=");
if(strs[1]!=null || !" ".equals(strs[1])){//去掉val是" "的。
map.put(strs[0], strs[1]);
}
return map;
}
private static List> getAllList(Map map){
List> list = new ArrayList>();
Map valMap = new HashMap();
Set keys = map.keySet();
Iterator it = keys.iterator();
String key="",val="";
while(it.hasNext()){
key=it.next();
val=map.get(key);
if(key.length()>="1.3.6.1.2.1.1.5".length() && key.contains("1.3.6.1.2.1.1.5")){
valMap.put("Name", val);
}else if(key.length()>="1.3.6.1.2.1.2.1".length() && key.contains("1.3.6.1.2.1.2.1")){
valMap.put("portnumber", val);
}else if(key.length()>="1.3.6.1.2.1.2.2.1.1".length() && key.contains("1.3.6.1.2.1.2.2.1.1")){
valMap.put("portindex", val);
}else if(key.length()>="1.3.6.1.2.1.31.1.1.1.1".length() && key.contains("1.3.6.1.2.1.31.1.1.1.1")){
valMap.put("portfcvalue", val);
}else if(key.length()>="1.3.6.1.2.1.2.2.1.3".length() && key.contains("1.3.6.1.2.1.2.2.1.3")){
valMap.put("porttype", val);
}
if(valMap != null && valMap.size()>0){
list.add(valMap);
}
}
return list;
}
}
1.3.6.1.2.1.2.2.1.1.16777216 = 16777216
1.3.6.1.2.1.2.2.1.1.16781312 = 16781312
1.3.6.1.2.1.2.2.1.1.16785408 = 16785408
这三个里面都同时包含1.3.6.1.2.1.2.2.1.1,contains是包含的意思*1.3.6.1.2.1.2.2.1.1*,如果字符串是固定的可以用equals去判断
楼主的意思是想少写if else? 那么可以把你要匹配的字符串用mpa存起来循环map来匹配.