公司面试题,请大家看哈兹,应该怎么做,说个思路也行
Java Test
- Write a program that can parse a Windows .ini format file and store the contents in memory (in some datatype/class of your choice)
- Also provide some convenience api that allows a developer to retrieve information from the parsed representation
e.g. getIniKeys()
getIniVals()
getIniVal(String aKey, aGroupName)
getGroup(String aGroupName
- Provide an interactive way to query different attributes, e.g, myname, main.theIP, Complex_Context.myname
Sample Ini File
===============
myname = props
[main]
theIP = 192.184.12.1
DNS = 34.2.4.5
DNS = 15.19.27.84
# defines a group
[myhome]
IP = 192.184.12.2
IP = 192.168.12.50
[complex context]
MyName = hallo
Some Rules To keep in Mind
==========================
a. Ini File consists of a set of attribute value pairs that are grouped into sections/groups
b. Groups are enclosed within "[] "
c. Strip off any whitespaces encountered between keys or values
d. comments begin with "# "
e. there could be blank lines in the file
f. there could be white space in the group name (which should be preserved)
g. A key could have multiple values (e.g. IP in the above sample has two possible values) which should be preserved
What are we testing
====================
- The programmer 's ability to write good clean, readable code that solves the above problem.
- We are NOT looking for efficiency, speed, algorithmic abilities in solving this problem
[解决办法]
Map看起来不错,呵呵
[解决办法]
傻傻的一个办法 @_@
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Test2 {
public static void main(String[] args) {
INI ini = new INI( "test.ini ");
List <String> keys = ini.getIniKeys();
ini.print(keys);
System.out.println();
List <String> values = ini.getIniValues();
ini.print(values);
System.out.println();
ini.print();
System.out.println();
Map <String, List <String> > map = ini.getGroup( "main ");
ini.print(map);
System.out.println();
List <String> list = ini.getIniValues( "ip ", "myhome ");
ini.print(list);
}
}
class INI {
private Map <String, Map <String, List <String> > > inis =
new HashMap <String, Map <String, List <String> > > ();
private INI() {
}
public INI(String filename) {
loadFile(filename);
}
/**
* 获得所有的键名
* @return
*/
public List <String> getIniKeys() {
List <String> keys = new ArrayList <String> ();
for(Map.Entry <String, Map <String, List <String> > > entry : inis.entrySet()) {
for(Map.Entry <String, List <String> > e : entry.getValue().entrySet()) {
keys.add(e.getKey());
}
}
return keys;
}
/**
* 获得所有值
* @return
*/
public List <String> getIniValues() {
List <String> values = new ArrayList <String> ();
for(Map.Entry <String, Map <String, List <String> > > entry : inis.entrySet()) {
for(Map.Entry <String, List <String> > e : entry.getValue().entrySet()) {
for(String s : e.getValue()) {
values.add(s);
}
}
}
return values;
}
/**
* 根据组名、键名查找值
* @param key
* @param group
* @return
*/
public List <String> getIniValues(String key, String group) {
Map <String, List <String> > map = inis.get(group.toLowerCase());
List <String> values = map.get(key.toLowerCase());
return values;
}
/**
* 根据组名查找数据
* @param group
* @return
*/
public Map <String, List <String> > getGroup(String group) {
Map <String, List <String> > map = inis.get(group.toLowerCase());
return map;
}
/**
* 输出某一项数据
* @param list
*/
public void print(List <String> list) {
for(String s : list) {
System.out.println(s);
}
}
/**
* 输出某一组的数据
* @param map
*/
public void print(Map <String, List <String> > map) {
for(Map.Entry <String, List <String> > entry : map.entrySet()) {
for(String s : entry.getValue()) {
System.out.printf( "%s = %s%n ", entry.getKey(), s);
}
}
}
/**
* 输出整个 ini 数据
*/
public void print() {
for(Map.Entry <String, Map <String, List <String> > > entry : inis.entrySet()) {
System.out.printf( "[%s]%n ", entry.getKey());
for(Map.Entry <String, List <String> > e : entry.getValue().entrySet()) {
for(String s : e.getValue()) {
System.out.printf( "%s = %s%n ", e.getKey(), s);
}
}
}
}
/**
* 从文件中加载数据,全部转为小写字母
* @param filename
*/
private void loadFile(String filename) {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(filename));
String s = " ";
String group = " ";
while((s = br.readLine()) != null) {
s = s.trim();
if(s.length() < 1 || s.charAt(0) == '# ') {
continue;
}
if(s.matches( "\\[.*\\] ")){
group = s.substring(1, s.length()-1).toLowerCase();
}else{
String key = s.split( "= ")[0].trim().toLowerCase();
String value = s.split( "= ")[1].trim().toLowerCase();
Map <String, List <String> > map = null;
if(inis.get(group)==null) {
map = new HashMap <String, List <String> > ();
}else{
map = inis.get(group);
}
List <String> list = null;
if(map.get(key)==null) {
list = new ArrayList <String> ();
}else{
list = map.get(key);
}
list.add(value);
map.put(key, list);
inis.put(group, map);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}