文档章节

去除相邻重复字符函数

yonj1e
 yonj1e
发布于 2017/04/05 17:17
字数 801
阅读 27
收藏 0

字符去重函数
功能:去重字符串相邻重复的字符,不相邻的不用去重
参数:

  1. arg1 -- 输入字符串
  2. arg2 -- 字符串开始位置
  3. arg3 -- 字符串结束位置

要求:

  1. 输入参数为arg1时, 对这个字符串去重
  2. 输入参数为arg1,arg2时, 从arg2位置到字符串结束,去重
  3. 输入参数为arg1,arg2,arg3时,从arg2到arg3位置,去重

src/include/catalog/pg_proc.h 

DATA(insert OID = 6669 (  remove_dup_char PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ remove_dup_char_arg1 _null_ _null_ _null_ ));
DESCR("Remove duplicate characters.");
DATA(insert OID = 6670 (  remove_dup_char PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "25 23" _null_ _null_ _null_ _null_ _null_ remove_dup_char_arg2 _null_ _null_ _null_ ));
DESCR("Remove duplicate characters.");
DATA(insert OID = 6671 (  remove_dup_char PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 25 "25 23 23" _null_ _null_ _null_ _null_ _null_ remove_dup_char_arg3 _null_ _null_ _null_ ));
DESCR("Remove duplicate characters.");

 src/backend/utils/adt/myfuncs.c

/* 
 * Remove duplicate characters 
 * author:young
 */
Datum 
remove_dup_char_arg1 (PG_FUNCTION_ARGS)
{
	int n = 0;
	text *arg0 = PG_GETARG_TEXT_P(0);

	char *str = text_to_cstring(arg0);
	n = strlen(str);

	remove_dup(str, 0, n);

	PG_RETURN_TEXT_P(cstring_to_text(str));
}

Datum 
remove_dup_char_arg2 (PG_FUNCTION_ARGS)
{
	int n = 0;
	text *arg0 = PG_GETARG_TEXT_P(0);
	int32 arg1 = PG_GETARG_INT32(1);

	char *str = text_to_cstring(arg0);
	n = strlen(str);

	if (!(1 <= arg1 && arg1 <= n))
	{
		ereport(ERROR,
			(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
			errmsg("out of range")));
	}

	remove_dup(str, arg1 - 1, n);

	PG_RETURN_TEXT_P(cstring_to_text(str));
}

Datum 
remove_dup_char_arg3 (PG_FUNCTION_ARGS)
{
	int n = 0;
	text *arg0 = PG_GETARG_TEXT_P(0);
	int32 arg1 = PG_GETARG_INT32(1);
	int32 arg2 = PG_GETARG_INT32(2);

	char *str = text_to_cstring(arg0);
	n = strlen(str);

	if (!(1 <= arg1 && arg1 <= arg2 && arg2 <= n))
	{
		ereport(ERROR,
			(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
			errmsg("out of range")));
	}

	remove_dup(str, arg1 - 1, arg2 - 1);

	PG_RETURN_TEXT_P(cstring_to_text(str));
}

void 
remove_dup(char *str, int start, int end)
{
	int i = start, k = start;

	for (i = start; i <= end; i++)  
	{
		if (str[i + 1] && str[i + 1] == str[i] && i + 1 <= end)
		{
			k++;
		} 
		else  
		{
			str[i-k] = str[i];
		}			  
	}
	str[i-k] = '\0';
}

比较繁琐,再做一下修改,三个函数放到一个中

src/include/catalog/pg_proc.h 

DATA(insert OID = 6669 (  remove_dup_char PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ remove_dup_char _null_ _null_ _null_ ));
DESCR("Remove duplicate characters.");
DATA(insert OID = 6670 (  remove_dup_char PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "25 23" _null_ _null_ _null_ _null_ _null_ remove_dup_char _null_ _null_ _null_ ));
DESCR("Remove duplicate characters.");
DATA(insert OID = 6671 (  remove_dup_char PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 25 "25 23 23" _null_ _null_ _null_ _null_ _null_ remove_dup_char _null_ _null_ _null_ ));
DESCR("Remove duplicate characters.");

src/backend/utils/adt/myfuncs.c

添加定义:

#define PG_GETARG_IF_EXISTS(n, type, defval) \
	((PG_NARGS() > (n) && !PG_ARGISNULL(n)) ? PG_GETARG_##type(n) : (defval)) 

 修改方法:

/* 
 * Remove duplicate characters 
 * author:yangjie
 */
Datum 
remove_dup_char (PG_FUNCTION_ARGS)
{
	text *arg0 = PG_GETARG_IF_EXISTS(0, TEXT_P, NULL);
	int32 arg1 = PG_GETARG_IF_EXISTS(1, INT32, 0);
	int32 arg2 = PG_GETARG_IF_EXISTS(2, INT32, 0);
	int n = 0;

	char *str = text_to_cstring(arg0);
	n = strlen(str);

	if(PG_NARGS() == 1)
	{
		remove_dup(str, 0, n);
	}

	if(PG_NARGS() == 2)
	{
		if (!(1 <= arg1 && arg1 <= n))
		{
			ereport(ERROR,
				(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
				errmsg("out of range")));
		}
		remove_dup(str, arg1 - 1, n);
	}

	if(PG_NARGS() == 3)
	{
		if (!(1 <= arg1 && arg1 <= arg2 && arg2 <= n))
		{
			ereport(ERROR,
				(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
				errmsg("out of range")));
		}
		remove_dup(str, arg1 - 1, arg2 - 1);
	}

	PG_RETURN_TEXT_P(cstring_to_text(str));
}

 再修改一下,如果有输入参数就用 没有就用默认值  最后再去重处理减少代码重用

/* 
 * Remove duplicate characters 
 * author:yangjie
 */
Datum 
remove_dup_char (PG_FUNCTION_ARGS)
{
	text *arg0 = PG_GETARG_IF_EXISTS(0, TEXT_P, NULL);
	int n = 0;
	char *str = text_to_cstring(arg0);
	n = strlen(str);
	int32 arg1 = PG_GETARG_IF_EXISTS(1, INT32, 0);
	int32 arg2 = PG_GETARG_IF_EXISTS(2, INT32, n);
	
	if (!(1 <= arg1 && arg1 <= n))
	{
		ereport(ERROR,
			(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
			errmsg("1 <= arg1 && arg1 <= n")));
	}

	if (!(1 <= arg1 && arg1 <= arg2 && arg2 <= n))
	{
		ereport(ERROR,
			(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
			errmsg("1 <= arg1 && arg1 <= arg2 && arg2 <= n")));
	}

	remove_dup(str, arg1, arg2);
	
	PG_RETURN_TEXT_P(cstring_to_text(str));
}

void 
remove_dup(char *str, int start, int end)
{
	int i = start -1, k = start - 1;

	for (i = start - 1; i <= end - 1; i++)  
	{
		if (str[i + 1] && str[i + 1] == str[i] && i + 1 <= end - 1)
		{
			k++;
		} 
		else  
		{
			str[i-k] = str[i];
		}			  
	}
	str[i-k] = '\0';
}

 

© 著作权归作者所有

yonj1e
粉丝 18
博文 20
码字总数 31358
作品 0
济南
后端工程师
私信 提问
Linux正则表达式与文本处理命令

一、正则表达式 正则表达式:是一类字符所书写出的模式(pattern) 元字符:类似通配符,不表示字符本身的意义,用于额外功能性的描述 基本正则表达式(BRE)和扩展正则表达式(ERE) 基本正则元...

Jy_BigBoss
2017/11/23
0
0
linux关于处理文本内容的命令!!

最近学习了 一些处理文本内容的命令今天总结一下,以便以后复习! 以下命令只列出了一些常用参数. uniq 命令 uniq 命令不加参数可以去除出文件中重复行(这些重复的行必须相邻,不相邻不能去除)...

求学ing
2013/03/22
126
0
linux sort,uniq,cut,wc命令详解

sort sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出。如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序。 sort语法 [root@www ...

刀心
2015/06/10
0
0
leetcode-79-单词搜索(用dfs解决)

题目描述: 给定一个二维网格和一个单词,找出该单词是否存在于网格中。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个...

king_3
2018/08/19
0
0
关于字符串去重的c语言算法

对于像aabbbcccccdddddddeeeeeeeeefff这样的相邻重复字符串A以及像flskdfjlskdfle.,.;,;,p43hpp42h这样的非相邻重复字符串B,利用C语言算法实现字符去重时。 A可以记住长度为128的int数组来实...

Yogoo
2013/01/21
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

setState() called after dispose() flutter

# 在setState前加入以下判断if (!mounted) return;

zdglf
16分钟前
3
0
docker和docker-compose二种方式安装mysql8.0

Docker方式安装 在命令行下运行 docker run -d -p 3306:3306 --restart always --privileged=true--name mysql-e MYSQL_USER="test" -e MYSQL_PASSWORD="test" -e MYSQL_ROOT_PASSWOR......

小白的成长
25分钟前
5
0
五大网络威胁应对挑战

既然如此,那么威胁的检测和响应过程是否像生产瑞士手表那样高效运行呢?答案远非如此。据ESG报告显示,威胁检测和响应过程充满各种各样的问题。来自372名企业网络安全和IT专家的数据,以下是...

linuxCool
26分钟前
4
0
jQuery 选择器使用大全(标签选择器,ID选择器等)

jQuery的选择器是CSS 1-3,XPath的结合物。jQuery提取这二种查询语言最好的部分,融合后创造出了最终的jQuery表达式查询语言。如果你了解CSS(绝大部分WEB开发者都用到的),那么你学起来就很...

前端老手
32分钟前
4
0
HBase四种部署模式和基本操作

本文主要包括两部分的内容,第一部分主要包HBase的四种安装方法,分别是:① 单机版模式,② 伪集群模式,③ 使用HBase自带的zookeeper构建分布式集群,④ 使用独立安装的zookeeper构建分布式...

繁荣3000
40分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部