C++中实现java的方法(二)-----ArrayList类
本章节主要是在讲解我在C++中实现的第一个java方法即:ArrayList
首先是说明一下:由于参考java方法并不能直接在C++中完美实现,所以本种方法只能最大限度的还原相关方法
简单样例如下
#include <iostream>
#include "ArrayList.cpp"
int main() {
ArrayList<double> list=ArrayList<double>();
list.add(2.5);
list.add(3.5);
list.add(1,4.5);
list.remove(2.5);
cout <<list.size()<<endl;
print(list);
return 0;
}
ArrayList是java中的动态数组,都隶属于List方法下,由于在C++中并没有这种方法,所以我自己将相关方法重写一下,删去了一些多余方法,保留了大部分方法
方法如下:
clone()复制当前数组,并返回
isEmpty()返回布尔类型,检测当前是否为空,空返回true
indexOf(Object o)返回第一个检测到的o的位置,如果没有就返回-1
add(T t)在动态数组结尾添加个内容
add(int index, T t)在index位置加上个内容
size()返回目前该数组有的数据量,以int形式返回
get(int index)获取相应位置的数据
remove(Object o):移除此列表中首次出现的指定元素(如果存在,存在返回true)。
remove(int index):移除此列表中指定位置上的元素。
toString()返回当前动态数组的字符串形式,以string形式返回
set(int index, Object o)设置在index位置的内容为o
clear()清空当前动态数组
bool contains(Object o) 返回是否含有该内容的布尔类型,含有即为true
trimToSize() 删去多余的数组容量,变成实际容量
replace(Object old, Object newobj)将原有第一个的old内容换成新的newobj
remove(int start, Object old, Object newobj)增加了开始区间,其他同上
replaceAll(Object old, Object newobj)替换全部的old为newobj
为实现这种方法,我先利用的C++里面的基础template的方法
按照java中的习惯,本ArrayList方法中,总的泛型名称为Object
最开始使用的方法由于直接利用指针强制替换存在内存的内容,导致该种方法并不安全,所以在新的更新后采取了java中的方法,即在满后进行扩容,部分变量名来源java原生方法
由于C++中并没有相关Java的报错方法,所以采取了如下的方法来报错
if (index>= length||index<0)
{
string s="ArrayIndexOutOfBoundsException Index: ";
ostringstream oss;
oss<<index;
s.append(oss.str());
s.append(", Size: ");
ostringstream oss2;
oss2<<length;
s.append(oss2.str());
cout<<s;
exit(1);
}
利用这种方法,避免了指针指出数组的问题,同时可以报错,来很好的提醒编程者,有关错误
报错的内容来源于java原生方法
接下来就是本类方法的源码:
//按照java原生ArrayList编写
// 由开心创建于2020年
//使用方法参考开发日志
// this method is from java original method called ArrayList
// made by happy on 2020
// please read the CAVA development logs
//version 1.0
//@email :1013214271@qq.com
#include<iostream>
#include<string>
#include <sstream>
using namespace std;
template <class Object>
class ArrayList {
private:
int DEFAULT_CAPACITY=10;
int length =0;
Object *arr=new Object[10];
template<typename T> string TtoString(const T& t){
ostringstream oss;
oss<<t;
return oss.str();
}
void makesure(){
if(length==DEFAULT_CAPACITY){
grow();
if(length==DEFAULT_CAPACITY){
DEFAULT_CAPACITY++;
grow();
}
}
}
void grow(){
DEFAULT_CAPACITY=DEFAULT_CAPACITY+(DEFAULT_CAPACITY>>1);
Object* tmp=new Object[DEFAULT_CAPACITY];
for (int i = 0; i <length; i++){
tmp[i]=arr[i];
}
delete[] arr;
arr=tmp;
}
int indexOfRange(Object o, int start, int end) {
Object* tmp=clone();
int i;
if (o == NULL) {
for(i = start; i < end; ++i) {
if (tmp[i] == NULL) {
return i;
}
}
} else {
for(i = start; i < end; ++i) {
if (o==tmp[i]) {
return i;
}
}
}
return -1;
}
public :
void replace(Object old, Object newobj) {
for (int i=0;i<length;i++) {
if (arr[i] == old) {
arr[i]=newobj;
return;
}
}
}
void replaceAll(Object old, Object newobj) {
for (int i=0;i<length;i++) {
if (arr[i] == old) {
arr[i]=newobj;
}
}
}
void remove(int start, Object old, Object newobj) {
if(start>=length||start<0) {
string s="ArrayIndexOutOfBoundsException start: ";
ostringstream oss;
oss<<start;
s.append(oss.str());
s.append(", Size: ");
ostringstream oss2;
oss2<<length;
s.append(oss2.str());
cout<<s;
exit(1);
}
for (int i=start; i<length;i++) {
if (arr[i] == old) {
arr[i]=newobj;
return;
}
}
}
void trimToSize() {
arr=clone();
DEFAULT_CAPACITY=length;
}
bool contains(Object o) {
return indexOf(o) >= 0;
}
Object* clone() {
Object* o = new Object[length];
for (int i = 0; i < length; i++){
o[i]=arr[i];
}
return o;
}
bool isEmpty() {
return length == 0;
}
int indexOf(Object o) {
return indexOfRange(o, 0, length);
}
void add(Object t) {
makesure();
arr[length] = t;
length++;
}
void add(int index, Object t) {
if(index>length||index<0){
string s="IndexOutOfBoundsException Index: ";
ostringstream oss;
oss<<index;
s.append(oss.str());
s.append(", Size: ");
ostringstream oss2;
oss2<<length;
s.append(oss2.str());
cout<<s;
exit(1);
}
else if(index==length){
add(t);
}
else{
Object *ob;
ob=new Object[length+1];
for(int i=0;i<length+1;i++){
if(i<index){
ob[i]=arr[i];
}
else if (i==index){
ob[index]=t;
}
else{
ob[i]=arr[i-1];
}
}
delete[] arr;
DEFAULT_CAPACITY++;
arr=ob;
}
length++;
}
template <class T>
bool remove(T o) {
for (int index = 0; index < length; index++){
if (o==arr[index]) {
remove(index);
return true;
}
}
return false;
}
void remove(int index){
if(index>length||index<0){
string s="IndexOutOfBoundsException Index: ";
ostringstream oss;
oss<<index;
s.append(oss.str());
s.append(", Size: ");
ostringstream oss2;
oss2<<length;
s.append(oss2.str());
cout<<s;
exit(1);
}
else if(index==length){
arr[index]=NULL;
}
else{
for (int i = index; i <length-1 ; ++i) {
arr[i]=arr[i+1];
}
arr[length]=NULL;
}
length--;
}
void set(int index, Object o){
if (index>= length||index<0)
{
string s="ArrayIndexOutOfBoundsException Index: ";
ostringstream oss;
oss<<index;
s.append(oss.str());
s.append(", Size: ");
ostringstream oss2;
oss2<<length;
s.append(oss2.str());
cout<<s;
exit(1);
}
else{
arr[index]=o;
}
}
int size() {
return length;
}
void clear() {
delete[] arr;
DEFAULT_CAPACITY=10;
length =0;
arr=new Object[10];
}
Object get(int index) {
if (index>= length||index<0)
{
string s="ArrayIndexOutOfBoundsException Index: ";
ostringstream oss;
oss<<index;
s.append(oss.str());
s.append(", Size: ");
ostringstream oss2;
oss2<<length;
s.append(oss2.str());
cout<<s;
exit(1);
}
else
{
return arr[index];
}
}
Object* toArray() {
return arr;
}
string toString() {
if (length==0)
{
string s2;
s2="[]";
return s2;
}
else
{
string s;
s.append("[");
int i=0;
while(true){
s.append(TtoString(get(i)));
i++;
if(i==length){
s.append("]");
return s;
}
s.append(", ");
}
}
}
};
按照计划,下一章是linkedlist类,欢迎提出宝贵意见。帮助我进一步完善cava。