Delphi字符串排列顺序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi字符串排列顺序相关的知识,希望对你有一定的参考价值。
将:abcdefg
排列成:badcfe3g
将两位颠倒位置,最后不够两位颠倒的话补3凑够两位颠倒。
function upendStr(Rstr:string):string;
var
i:integer;
str : string;
begin
str := Rstr;
//如果字符串长度为奇数,未补3
if odd(length(RStr)) then
str := Rstr+'3';
//
for i:=1 to length(str)div 2 do
result:=result+str[I*2]+str[i*2-1];
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(upendStr('abcdefg'))
end; 参考技术A 分组排序 参考技术B 放入 TStringList 排序 参考技术C randomize 函数名: randomize
功 能: 初始化随机数发生器
适用语言;BASIC,VISUAL BASIC,C,C++,Delphi等
用 法: void randomize(void);
程序例:
#include stdlib.h
int main(void)
int i;
randomize();
printf("Ten random numbers from 0 to 99\n\n");
for(i=0; i10; i++)
printf("%d\n", rand() % 100);
return 0;
VB 中的用法 Randomize 语句示例
本示例用 Randomize 语句初始化随机数生成器。由于忽略了数值参数, 所以 Randomize 用 Timer 函数的返回值作为新的随机数种子值。
Dim MyValue
Randomize ' 对随机数生成器做初始化的动作。
MyValue = Int((6 * Rnd) + 1) ' 生成 1 到 6 之间的随机数值。
Delphi 中的用法
以下事例将随机产生0到100的数字,如果不使用Randomize函数,得到的结果将有规律性。
procedure TForm1.btn1Click(Sender: TObject);
begin
randomize;
ShowMessage(IntToStr(Random(100)));
end;
randomize加了TIMER是用系统的时钟来产生随机种子,这样才能保证每次随即的数尽量重复
用单词和数字按字母顺序排列字符串
【中文标题】用单词和数字按字母顺序排列字符串【英文标题】:Alphabetize string with words and numbers 【发布时间】:2016-02-27 06:11:35 【问题描述】:我试图弄清楚如何对包含单词和数字的单个字符串进行字母排序。正如您在下面看到的,我尝试使用isdigit
,但有些数字是负数,所以我的代码总是错误的。另外,我的代码将字符串拆分为单独按字母顺序排列的子字符串,但我不知道如何分别按字母顺序排列所有单词,将它们放回向量中的位置,然后分别按字母顺序排列所有数字,然后放回去进入他们的位置。有人可以帮忙吗?
编辑:
示例输入 #1:
4 dog 1 -3 0 cat 3
示例输出 #1:
-3 cat 0 1 3 dog 4
示例输入 #2:
tom 4 0 9 kid pie 1
示例输出 #2:
kid 0 1 4 pie tom 9
到目前为止,我的代码如下所示:
vector<string> numbers;
string str;
string x;
getline (cin, str);
stringstream ss(str);
while (ss >> x)
numbers.push_back(x);
if (numbers.size()==1)
cout << numbers[0] << endl;
return 0;
vector<int> results(numbers.size());
for (int i=0;i<numbers.size();i++)
char *a=new char[numbers[i].size()+1];
a[numbers[i].size()]=0;
memcpy(a,numbers[i].c_str(),numbers[i].size());
if(isdigit(*a)==0)
results[i]=1;
else
results[i]=0;
int j=0;
while (j<numbers.size())
int k=j+1;
while (k<numbers.size())
while (results[j]==results[k])
sort(numbers.begin()+j,numbers.begin()+k+1);
k++;
j=k;
k=numbers.size();
if(j==numbers.size())
for (int i=0; i<numbers.size();i++)
cout << numbers[i] << " ";
j++;
【问题讨论】:
请发布示例输入、预期输出和观察到的输出。 你能分享示例输入输出吗?需要确定你想要做什么。char *a=new char[numbers[i].size()+1];
为什么??
刚刚提供了一些示例输入和输出。
@Jeremy 你为什么不直接使用std::string
?绝对没有必要做你正在做的事情。此外,您还引入了内存泄漏。 string a = numbers[i];
【参考方案1】:
首先,您需要一个函数来确定字符串是否为数字。为此使用strtol
:
#include <stdlib.h> // strtol
bool is_number( const std::string &str, long &num )
char *p;
num = strtol( str.c_str(), &p, 10 );
return *p == '\0';
在第二个函数中使用这个函数,判断字符串a
是否小于字符串b
。
#include <tuple>
bool sortFunc( const std::string &a, const std::string &b )
long numA;
long numB;
bool is_a_num = is_number( a, numA );
bool is_b_num = is_number( b, numB );
return std::make_tuple( !is_a_num, numA, a ) < std::make_tuple( !is_b_num, numB, b );
使用std::sort
,对std::vector
中的字符串进行排序
// include <algorithm> // sort
std::vector< std::string > numbers;
....
std::sort( numbers.begin(), numbers.end(), sortFunc );
另一种解决方案是将vector
拆分为两个单独的vector
s。一个用于字符串,一个用于数字并分别排序:
std::vector< std::string > numbers;
....
std::vector< std::string > vStr;
std::vector< long > vNum;
for ( std::string &str: numbers )
long num;
if ( is_number( str, num )
vNum.push_back( num );
else
vStr.push_back( str);
std::sort( vNum.begin(), vNum.end() );
std::sort( vStr.begin(), vStr.end() );
如果您想知道每个字符串或数字在原始vector
中的位置,请使用std::map
。
#include <map>
std::vector< std::string > numbers;
....
std::map< std::string, size_t > mapStr; // map string to index of string in vector numbers
std::map< long, size_t > mapNum; // map number to index of number in vector numbers
for ( size_t index = 0; index < numbers.size(); index ++ )
long num;
if ( is_number( numbers[index], num ) )
mapNum.emplace( num, index );
else
mapStr.emplace( numbers[index], index );
for ( auto & pa : mapNum )
std::cout << pa.first << " pos " << pa.second << std::endl;
for ( auto & pa : mapStr )
std::cout << pa.first.c_str() << " pos " << pa.second << std::endl;
当然,您也可以将单个std::map
与比较器功能一起使用:
std::vector< std::string > numbers;
....
std::map< std::string, size_t, bool(*)(const std::string &a, const std::string &b) > mapN( sortFunc );
for ( size_t index = 0; index < numbers.size(); index ++ )
mapN.emplace( numbers[index], index );
for ( auto & pa : mapN )
std::cout << pa.first << " pos " << pa.second << std::endl;
您也可以使用std::tuple
作为std::map
的键:
std::vector< std::string > numbers;
....
std::map< std::tuple< bool, long, std::string>, size_t > mapTupleN;
for ( size_t index = 0; index < numbers.size(); index ++ )
long num;
bool is_num = is_number( numbers[index], num );
mapTupleN.emplace( std::make_tuple( !is_num, num, numbers[index] ), index );
for ( auto & pa : mapTupleN )
if ( !std::get<0>(pa.first) )
std::cout << std::get<1>(pa.first) << " is number at position " << pa.second << std::endl;
else
std::cout << std::get<2>(pa.first).c_str() << " is string at position " << pa.second << std::endl;
【讨论】:
感谢您的帮助!我唯一看到的是这段代码不会将单词/数字放回分别属于单词和数字的位置。 @Jeremy 如果您想知道每个字符串或数字在原始向量中的位置,请使用std::map
。请参阅我答案的最后一部分。【参考方案2】:
我的 2p。
std::string alphabetize(const std::string& s)
// string parts here
std::vector<std::string> a;
// integer parts here
std::vector<int> n;
// remember the order of the input types (true = integer, false = string)
std::vector<bool> type_is_int_list;
// wrap input in a stream for easy parsing
std::istringstream iss(s);
// somewhere to read each part into
std::string item;
// extract one space-separated part at a time
while(iss >> item)
int i;
if(std::istringstream(item) >> i) // is item an integer?
n.push_back(i);
type_is_int_list.push_back(true);
else
a.push_back(item);
type_is_int_list.push_back(false);
// sort both string and integer vectors
std::sort(a.begin(), a.end());
std::sort(n.begin(), n.end());
// a place to rebuild the output from the input
std::ostringstream oss;
// keep track of where we are in each vector
auto a_iter = a.begin();
auto n_iter = n.begin();
// element separator
std::string sep;
// scan originally-ordered list of types to rebuild positions
for(bool type_is_int: type_is_int_list)
if(type_is_int)
oss << sep << *n_iter++; // add next sorted number to output
else
oss << sep << *a_iter++; // add next sorted string to output
sep = " "; // after first item need space separator
return oss.str(); // return the reconstructed string
【讨论】:
感谢您的帮助。我觉得这段代码是最易读和最容易理解的!【参考方案3】:在你读入元素时对它们进行排序可能更容易。
std::string input;
std::getline(std::cin, input);
std::stringstream ss(input);
std::vector<std::string> sorted;
while (ss >> input)
bool alpha = 0 < std::isalpha(input[0]); //if it is a word
for (std::size_t i = 0, e = sorted.size(); i != e; ++i)
if ((!!std::isalpha(sorted[i][0]) == alpha) && (alpha ? (input < sorted[i]) : (std::stoi(input) < std::stoi(sorted[i])))) //if input is <
std::swap(sorted[i], input); //exchange places
sorted.emplace_back(std::move(input)); //insert input at end
while
循环的每次迭代都会检查第一个字符是否为字母。如果是字母,则必须是单词,否则是数字。然后,对于每个先前扫描的元素,它会检查它们是否都是相同的类型(字母/字母、数字/数字)。在它们都是单词的情况下,它只是比较它们。如果它们是数字,它使用stoi
将它们转换为整数并比较结果。如果比较得出input
小于元素,则将元素与input
交换。在for
循环结束时,input
是该类型中最大的元素,它被插入到后面。
It lives!
在此比较中大小写很重要 ('a' != 'A'
),但如果无关紧要,添加修复也很容易。
【讨论】:
对不起,名为 sorted 的向量从何而来? @Jeremy 我意识到我把它遗漏了,我编辑了变量声明。也许你需要重新加载页面。【参考方案4】:这个怎么样?
#include "iostream"
#include "algorithm"
#include "string"
#include "vector"
#include "cctype"
#include "unordered_map"
using namespace std;
int main()
vector <string> all, s;
vector <int> n;
unordered_map <int, bool> number;
string x;
getline(cin, x);
int prev=0;
for (int i=0; i<x.length(); i++)
if (x[i]==' ')
all.push_back(x.substr(prev, i-prev+1));
prev=i+1;
all.push_back(x.substr(prev));
for (int i=0; i<all.size(); i++)
if (isdigit(all[i].c_str()[0]) || isdigit(all[i].c_str()[1]))
n.push_back(atoi(all[i].c_str()));
number[i]=1;
else s.push_back(all[i]);
sort(s.begin(), s.end());
sort(n.begin(), n.end());
for (int i=0, j=0, k=0; i<all.size(); i++)
if (number[i]) cout << n[j++] << ' ';
else cout << s[k++] << ' ';
【讨论】:
这样看起来更好,但是如果你不能预先预测元素的数量,请提一下,我会相应地修改代码。 我无法预测元素的数量以上是关于Delphi字符串排列顺序的主要内容,如果未能解决你的问题,请参考以下文章
delphi编程, 如何实现赋值StringGrid表格内的数字按顺序排列