📄 booleanexp.cpp
字号:
#include <vector>
#include <ComCtrls.hpp>
#include "BooleanExp.h"
//2007.08 宋双
VariableExp::VariableExp(AnsiString name,AnsiString of,AnsiString val)
{
fieldName=name;
op=of;
fieldVal=val;
}
void VariableExp::destory()
{
delete this;
}
bool VariableExp::isFloat(TListView* view,int index)
{
bool flag=true;
for(int i=view->Items->Count-1;i>=0&&flag==true;i--)
{
AnsiString tmp=view->Items->Item[i]->SubItems->Strings[index].Trim();
for(int j=tmp.Length();j>=1;j--)
{
if(tmp[j]>='0'&&tmp[j]<='9'||tmp[j]=='.')
flag=true;
else
{
flag=false;
break;
}
}
}
return flag;
}
vector<int> VariableExp::FiltListView(TListView* view)
{
vector<int> vec;
int index;
for(int i=1;i<view->Columns->Count;i++)
{
if(view->Columns->Items[i]->Caption.Trim()==fieldName.Trim())
{
index=i-1;
break;
}
}
char operate=op[1];
switch(operate)
{
case '> ':
if(isFloat(view,index))
{
for(int i=0;i<=view->Items->Count-1;i++)
{
if(fieldVal.ToDouble()<view->Items->Item[i]->SubItems->Strings[index].ToDouble())
vec.push_back(i);
}
}
else{
fieldVal=fieldVal.Trim();
for(int i=0;i<=view->Items->Count-1;i++)
{
AnsiString tmp=view->Items->Item[i]->SubItems->Strings[index].Trim();
int tmpp=fieldVal.AnsiCompare(tmp);
if(tmpp<0)
vec.push_back(i);
}
}
return vec;
case'<':
if(isFloat(view,index))
{
for(int i=0;i<=view->Items->Count-1;i++)
{
if(fieldVal.ToDouble()>view->Items->Item[i]->SubItems->Strings[index].ToDouble())
vec.push_back(i);
}
}
else{
fieldVal=fieldVal.Trim();
for(int i=0;i<=view->Items->Count-1;i++)
{
AnsiString tmp=view->Items->Item[i]->SubItems->Strings[index].Trim();
int tmpp=fieldVal.AnsiCompare(tmp);
if(tmpp>0)
vec.push_back(i);
}
}
return vec;
case'=':
fieldVal=fieldVal.Trim();
for(int i=0;i<=view->Items->Count-1;i++)
{
AnsiString tmp=view->Items->Item[i]->SubItems->Strings[index].Trim();
if(fieldVal==tmp)
vec.push_back(i);
}
return vec;
case'l':
fieldVal=fieldVal.Trim();
for(int i=0;i<view->Items->Count-1;i++)
{
AnsiString tmp=view->Items->Item[i]->SubItems->Strings[index].Trim();
if(tmp.Pos(fieldVal)!=0)
vec.push_back(i);
}
return vec;
}
}
AnsiString VariableExp::FiltDateSet()
{
return fieldName+op+"'"+fieldVal+"'";
}
AndExp::AndExp(BooleanExp* left,BooleanExp* right)
{
_operand1=left;
_operand2=right;
}
vector<int> AndExp::FiltListView(TListView* view)
{
vector<int> temp1=_operand1->FiltListView(view);
vector<int> temp2=_operand2->FiltListView(view);
sort(temp1.begin(),temp1.end());
sort(temp2.begin(),temp2.end());
vector<int>::iterator begin1=temp1.begin();
vector<int>::iterator begin2=temp2.begin();
vector<int>::const_iterator end1=temp1.end();
vector<int>::const_iterator end2=temp2.end();
vector<int> result;
while(begin1!=end1&&begin2!=end2)
{
if(*begin1<*begin2)
++begin1;
else if(*begin2<*begin1)
++begin2;
else{
result.push_back(*begin1);
++begin1;
++begin2;
}
} //求并集
return result;
}
void AndExp::destory()
{
_operand1->destory();
_operand2->destory();
delete this;
}
AnsiString AndExp::FiltDateSet()
{
return _operand1->FiltDateSet()+" and "+_operand2->FiltDateSet();
}
OrExp::OrExp(BooleanExp* left,BooleanExp* right)
{
_operand1=left;
_operand2=right;
}
vector<int> OrExp::FiltListView(TListView* view)
{
vector<int> temp1=_operand1->FiltListView(view);
vector<int> temp2=_operand2->FiltListView(view);
sort(temp1.begin(),temp1.end());
sort(temp2.begin(),temp2.end());
vector<int>::iterator begin1=temp1.begin();
vector<int>::iterator begin2=temp2.begin();
vector<int>::iterator end1=temp1.end();
vector<int>::iterator end2=temp2.end();
vector<int> result;
while(begin1!=end1&& begin2!=end2)
{
if(*begin1<*begin2)
{
result.push_back(*begin1);
++begin1;
}
else if(*begin2<*begin1)
{
result.push_back(*begin2);
++begin2;
}
else
{
result.push_back(*begin1);
++begin1;
++begin2;
}
}
if(begin1!=end1)
{
while(begin1!=end1)
{
result.push_back(*begin1);
++begin1;
}
}
else{
while(begin2!=end2)
{
result.push_back(*begin2);
++begin2; //求交集
}
}
return result;
}
void OrExp::destory()
{
_operand1->destory();
_operand2->destory();
delete this;
}
AnsiString OrExp::FiltDateSet()
{
return _operand1->FiltDateSet()+" or "+_operand2->FiltDateSet();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -