Uva 511 Updating a Dictionary

时间:2023-03-09 03:14:19
Uva 511 Updating a Dictionary

大致题意:用{ key:value, key:value, key:value }的形式表示一个字典key表示建,在一个字典内没有重复,value则可能重复    题目输入两个字典,如{a:3,b:4,c:10,f:16}  {a:3,c:5,d:10,ee:4}

    于新字典相比,找出旧字典的不同,并且输出用相应格式,增加的用'+',如 +d,ee

                              减少的用'-',如 -b,f

                              value变化的用*,如 *c

    没有不同则输出"No changes""

如果使用java,则可以用TreeMap对新旧字典做映射,然后对两个TreeMap对象做比较,同时注意一些小细节:

  

import java.util.*;

public class Main{
public static void main( String []args ) { Scanner in = new Scanner( System.in );
int T = Integer.parseInt( in.nextLine() );
while( T!=0 ) {
T --;
String oldStr = in.nextLine();
TreeMap<String, String> oldMap = new TreeMap<>();
str2Map(oldStr, oldMap);
String newStr = in.nextLine();
TreeMap<String, String> newMap = new TreeMap<>();
str2Map(newStr, newMap);
// 三个函数都要执行
boolean isChanged = addOrDel(newMap, oldMap, '+'); // 新字典中增加
isChanged = addOrDel(oldMap, newMap, '-') || isChanged; // 旧字典中减少
isChanged = isUpdate( newMap, oldMap, '*' ) || isChanged; // 更改过的
if( !isChanged ) {
System.out.println("No changes");
}
System.out.println();
}
} public static void str2Map( String str, TreeMap<String, String> map ) {
StringBuffer strbuffer = new StringBuffer(str);
for( int i=0; i<strbuffer.length(); i ++ ) {
if( !Character.isLetterOrDigit( strbuffer.charAt(i) ) ) {
// 将'{','}',':',','修改为空格
strbuffer.setCharAt(i, ' ');
}
}
// 以空格为分割符进行分割
StringTokenizer st = new StringTokenizer( new String(strbuffer), " ");
while( st.hasMoreTokens() ) {
map.put( st.nextToken() , st.nextToken() );
}
} public static boolean addOrDel( TreeMap<String, String> oldMap, TreeMap<String, String> newMap, char op ) {
boolean isChanged = false;
for( java.util.Map.Entry<String, String> entry : oldMap.entrySet()){
String strkey = entry.getKey();
// 只有其中一个字典有,而另一个字典没有
if( !newMap.containsKey(strkey) ) {
if( !isChanged ) {
System.out.print( op+strkey );
isChanged = true;
} else {
System.out.print( ","+strkey );
}
}
}
if( isChanged ) {
System.out.println();
}
return isChanged;
} public static boolean isUpdate( TreeMap<String, String> oldMap, TreeMap<String, String> newMap, char op ) {
boolean isChanged = false;
for( java.util.Map.Entry<String, String> entry : oldMap.entrySet() ) {
String strkey = entry.getKey();
// 新旧字典都有,但value不等
if( newMap.containsKey(strkey) && !newMap.get(strkey).equals( oldMap.get(strkey) ) ) {
if( !isChanged ) {
System.out.print( op + strkey );
isChanged = true;
} else {
System.out.print( "," + strkey );
}
}
}
if( isChanged ) {
System.out.println();
}
return isChanged;
}
}

如果是C++,也是类似的,用map做映射,也是注意一些细节即可

/*
UvaOJ 12504
Emerald
Sat 27 Jun 2015
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <map>
#include <sstream>
#include <string> using namespace std; string Standard( string str ) {
for( int i=0; i<str.length(); i++ ) {
if( !isalpha( str[i] ) && !isdigit( str[i] ) ) {
str[i] = ' ';
}
}
return str;
} void WriteMap( string& dict, std::map<string, string>& m ) {
dict = Standard( dict );
stringstream ss( dict );
string tmp, tmp2;
while( ss >> tmp ) {
ss >> tmp2;
m[ tmp ] = tmp2;
}
} bool CompareDict( std::map<string, string>& oldMap, std::map<string, string>& newMap, char op ) {
std::map<string, string>::iterator it;
bool isChanged = false;
for( it=newMap.begin(); it!=newMap.end(); it ++ ) {
if( !oldMap.count( it->first ) ) {
if( !isChanged ) {
printf("%c%s", op, it->first.c_str() );
isChanged = true;
} else {
printf(",%s", it->first.c_str());
}
}
}
if( isChanged ) {
printf("\n");
}
return isChanged;
} bool Update( std::map<string, string>& oldMap, std::map<string, string>& newMap ) {
bool isChanged = false;
std::map<string, string>::iterator it;
for( it=oldMap.begin(); it!=oldMap.end(); it ++ ) {
if( newMap.count( it->first ) && newMap[it->first]!=oldMap[it->first] ) { // defferent items
if( !isChanged ) {
printf("*%s", it->first.c_str() );
isChanged = true;
} else {
printf(",%s", it->first.c_str());
}
}
}
if( isChanged ) {
printf("\n");
}
return isChanged;
} int main() {
int T;
cin >> T;
cin.get();
while( T -- ) {
std::map<string, string> oldMap, newMap;
string oldDict;
getline( cin, oldDict );
WriteMap( oldDict, oldMap );
string newDict;
getline( cin, newDict );
WriteMap( newDict, newMap );
bool isChanged = CompareDict( oldMap, newMap, '+' ); // new add
isChanged = CompareDict( newMap, oldMap, '-' ) || isChanged ; // old del
isChanged = Update( oldMap, newMap ) || isChanged;
if( !isChanged ) {
printf("No changes\n");
}
printf("\n"); // blank line
}
return 0;
}