C++STL UVA12504 Updating a Dictionary 更新字典

(一)开发环境

  • Windows 10
  • Visual Studio 2017

(二)题目相关

1.题目

  • 本题中,字典是若干键值对,其中键为小写字母组的字符串,值为没有前导零或正号的非负整数(-4,03,+77都是非法的,注意该整数可以很大)。输入一个旧字典和一个新字典,计算二者的变化。输入的两个字典中键都是唯一的,但是排列顺序任意。其格式为(注意字典格式中不包含任何空白符):
    {key:value,key:value,···,key:value}
  • 输入包含两行,各包含不超过100个字符,即旧字典和新字典。输出格式如下:
    1. 如果包含至少有一个新增键,打印一个“+”号,然后是所有新增键,按字典顺序从小到大排列。
    2. 如果包含至少有一个删除键,打印一个“-”号,然后是所有删除键,按字典顺序从小到大排列。
    3. 如果包含至少有一个修改键,打印一个“*”号,然后是所有修改键,按字典顺序从小到大排列。
  • 例如,若输入两行分别为{a:3,b:4,c:10,f:6}和{a:3,c:,d:10,ee:4},则输出为:+d,ee;-b,f;*c

2.题目大意

  • 键和值对应,首先想到map
  • 获得的数据不能直接使用需要处理
  • map有自动排序,所以直接输出数据即可
  • ps.unordered_map是无排序功能的

3.数据分析

  1. 已知数据的格式为 {key:value,key:value,···,key:value}
  2. 为了得到更明显的特征可以暂时忽略 {}
  3. 得到新的格式为 key:value,key:value,···,key:value
  4. 若在最后的键值后补一个 ,
  5. key:value,key:value,···,key:value,
  6. 很容易发现 key 的后面是 : value 的后面是 ,
  7. 保存这些值并添加到map中即可

(三)代码相关

dictionary.h

// dictionary.h
#pragma once
#include <map>
#include <string>
#include <iostream>

class dictionary {
public:
	typedef std::map<std::string, std::string> ssMap;

	enum state {
		DEFAULT,
		KEY, VAL, ENDVAL
	};
public:
	dictionary(std::string &dicData);
	~dictionary();

	void init(std::string &dicData);
	void updating(std::string &dicData);
	void showDictionary();
private:
	ssMap dic;
	ssMap updataDic, deleteDic, modifyDic;
};

dictionary.cpp

// dictionary.cpp
#include "dictionary.h"

dictionary::dictionary(std::string &dicData) {
	init(dicData);
}

dictionary::~dictionary() {
}

void dictionary::init(std::string &dicData) {
	dic.clear();
	updataDic.clear();
	deleteDic.clear();
	modifyDic.clear();

	std::string dicKey, dicVal;
	state handleState = DEFAULT;

	for (auto &i : dicData) {
		if (i == '{') {
			handleState = KEY;
			continue;
		}
		else {
			if (handleState == ENDVAL) {
				break;
			}
			else {
				if (i == '}') {
					i = ',';
					handleState = ENDVAL;
				}
			}
			switch (handleState) {
			case KEY:
				if (i == ':') {
					handleState = VAL;
				}
				else if {
					dicKey += i;
				}
				break;
			case ENDVAL:
			case VAL:
				if (i == ',') {
					dic[dicKey] = dicVal;
					dicKey.clear();
					dicVal.clear();
					handleState = KEY;
				}
				else {
					dicVal += i;
				}
				break;
			default:
				break;
			}
		}
	}
}

void dictionary::updating(std::string &dicData) {
	updataDic.clear();
	deleteDic.clear();
	modifyDic.clear();

	ssMap newDic;
	std::string dicKey, dicVal;
	state handleState = DEFAULT;

	for (auto &i : dicData) {
		if (i == '{') {
			handleState = KEY;
			continue;
		}
		else {
			if (handleState == ENDVAL) {
				break;
			}
			else {
				if (i == '}') {
					i = ',';
					handleState = ENDVAL;
				}
			}
			switch (handleState) {
			case KEY:
				if (i == ':') {
					handleState = VAL;
				}
				else {
					dicKey += i;
				}
				break;
			case ENDVAL:
			case VAL:
				if (i == ',') {
					newDic[dicKey] = dicVal;
					auto state = dic.find(dicKey);
					if (state == dic.end()) {
						// 新增键
						updataDic[dicKey] = dicVal;
					}
					else if (dic[dicKey] != dicVal) {
						// 修改键
						modifyDic[dicKey] = state->second;
						dic.erase(state);
					}
					dicKey.clear();
					dicVal.clear();
					handleState = KEY;
				}
				else {
					dicVal += i;
				}
				break;
			default:
				break;
			}
		}
	}
	for (auto &i : dic) {
		auto state = newDic.find(i.first);
		if (state == newDic.end()) {
			deleteDic[i.first] = i.second;
		}
	}
	dic.swap(newDic);
}

void dictionary::showDictionary() {
	bool first = true;
	for (auto &i : updataDic) {
		if (first) {
			std::cout << '+';
		}
		else {
			std::cout << ',';
		}
		std::cout << i.first;
		first = false;
	}
	std::cout << ';';
	first = true;
	for (auto &i : deleteDic) {
		if (first) {
			std::cout << '-';
		}
		else {
			std::cout << ',';
		}
		std::cout << i.first;
		first = false;
	}
	std::cout << ';';
	first = true;
	for (auto &i : modifyDic) {
		if (first) {
			std::cout << '*';
		}
		else {
			std::cout << ',';
		}
		std::cout << i.first;
		first = false;
	}
	std::cout << std::endl;
}

main.cpp

// main.cpp
#include <iostream>
#include <cstdlib>
#include <string>

#include "dictionary.h"

int main() {
	// 这里并没有按照题意 参考代码
	/*
	std::getline(std::cin, data);
	由string提供的函数 用来获取一整行的数据
	*/
	std::string data = "{a:3,b:4,c:10,f:6}";
	dictionary dic(data);
	data = "{a:3,c:,d:10,ee:4}";
	dic.updating(data);
	dic.showDictionary();

	system("PAUSE");
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永恒盛夏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值