自定義的Troop<T>泛型類( c++, java和c#)的實(shí)現(xiàn)代碼
Troop<T>是一個(gè)泛型列表操作類,適用于非高性能和非大數(shù)據(jù)量的要求。包括了:取值get,賦值set,追加append,插入insert,清除remove,進(jìn)隊(duì)enqueue,出隊(duì)dequeue,交換swap,滾動(dòng)roll,進(jìn)棧push,出棧pop等日常操作。
//for more information, please access http://www.one-lab.net
using System;
using System.Collections.Generic;
using System.Text;
namespace onelab
{
public interface ISortable
{
void sort(bool decending);
}
public interface IStringable
{
int fromString(String input);
String toString();
}
public class Troop<T> : ICloneable
{
public override int GetHashCode()
{
return base.GetHashCode();
}
public override bool Equals(object obj) { return this == (Troop<T>)obj; }
public object Clone()
{
Troop<T> oValue = new Troop<T>();
oValue.cloneFrom(this);
return oValue;
}
protected bool equalsTo(Troop<T> aValue)
{
int len = aValue.length();
if (len == this.length())
{
for (int n = 0; n < len; n++)
{
if (!aValue.data[n].Equals(data[n]))
return false;
}
return true;
}
return false;
}
protected void cloneFrom(Troop<T> aValue)
{
data.Clear();
data.AddRange(aValue.data);
}
public static bool operator ==(Troop<T> a0, Troop<T> a1) { object o1 = (object)a0; object o2 = (object)a1; if (o1 == null && o2 == null) return true; return (o1 == null || o2 == null) ? false : a0.equalsTo(a1); }
public static bool operator !=(Troop<T> a0, Troop<T> a1) { object o1 = (object)a0; object o2 = (object)a1; if (o1 == null && o2 == null) return false; return (o1 == null || o2 == null) ? true : !a0.equalsTo(a1); }
private bool mHasError = false;
public bool hasError() { return mHasError; }
public List<T> data = new List<T>();
public T get(int index)
{
mHasError = false;
if (index >= 0 && index < data.Count)
return data[index];
mHasError = true;
return default(T);
}
public bool set(int index, T value)
{
if (index >= 0 && index < data.Count)
{
data[index] = value;
return true;
}
return false;
}
public void append(T value)
{
data.Add(value);
}
public bool insert(int index, T value)
{
if (index >= 0 && index < data.Count)
{
data.Insert(index, value);
return true;
}
return false;
}
public void appendRange(ref List<T> range)
{
data.AddRange(range);
}
public bool insertRange(int index, ref List<T> range)
{
if (index >= 0 && index < data.Count)
{
data.InsertRange(index, range);
return true;
}
return false;
}
public void clear()
{
data.Clear();
}
public bool remove(int index)
{
if (index >= 0 && index < data.Count)
{
data.RemoveAt(index);
return true;
}
return false;
}
public bool removeRange(int index, int count)
{
if (count > 0 && index >= 0 && ((index + count) <= data.Count))
{
data.RemoveRange(index, count);
return true;
}
return false;
}
public int length()
{
return data.Count;
}
public void enqueue(T value)
{
data.Insert(0, value);
}
public T dequeue()
{
mHasError = false;
int length = data.Count;
if (length > 0)
{
T b = data[length - 1];
data.RemoveAt(length - 1);
return b;
}
mHasError = true;
return default(T);
}
public void push(T value)
{
data.Add(value);
}
public T pop()
{
return dequeue();
}
public Troop<T> getRange(int index, int count)
{
Troop<T> output = new Troop<T>();
mHasError = true;
if (count > 0 && index >= 0 && ((index + count) <= data.Count))
{
output.data = data.GetRange(index, count);
mHasError = false;
}
return output;
}
public void reverse()
{
data.Reverse();
}
public bool swap(int index0, int index1)
{
int length = data.Count;
if (index0 >= 0 && index0 < length && index1 >= 0 && index1 < length)
{
T v = data[index0];
data[index0] = data[index1];
data[index1] = v;
return true;
}
return false;
}
public T take(int index)
{
mHasError = false;
if (index >= 0 && index < data.Count)
{
T v = data[index];
data.RemoveAt(index);
return v;
}
mHasError = true;
return default(T);
}
public void rollForward(int offset)
{
if (offset >= data.Count) return;
List<T> left = data.GetRange(offset - 1, data.Count - offset + 1);
List<T> right = data.GetRange(0, offset - 1);
data.Clear();
data.AddRange(left);
data.AddRange(right);
}
public void rollBackward(int offset)
{
if (offset >= data.Count) return;
List<T> left = data.GetRange(offset, data.Count - offset);
List<T> right = data.GetRange(0, offset);
data.Clear();
data.AddRange(left);
data.AddRange(right);
}
}
}
//for more information, please access http://www.one-lab.net
#ifndef VALUES_H
#define VALUES_H
#include <QList>
#include <QDebug>
namespace onelab
{
class ISortable
{
public:
virtual void sort(bool decending) = 0;
};
template <typename T>
class Troop
{
private:
bool mHasError;
static bool equals(const Troop<T> &from, const Troop<T> &to);
public:
QList<T> data;
Troop();
T get(int index);
bool set(int index, T value);
void append(T value);
bool insert(int index, T value);
void appendRange(const QList<T>& range);
bool insertRange(int index, const QList<T>& range);
void clear();
bool remove(int index);
bool removeRange(int index, int count);
int length() const;
void enqueue(T value);
T dequeue();
void push(T value);
T pop();
bool getRange(int index, int count, Troop<T>& output);
void reverse();
bool swap(int index0, int index1);
T take(int index);
void rollForward(int offset);
void rollBackward(int offset);
bool operator==(const Troop& input) const;
bool operator!=(const Troop& input) const;
bool hasError() const;
virtual QString toString();
virtual int fromString(const QString& input);
};
}
#endif // VALUES_H
//for more information, please access http://www.one-lab.net
#include "values.h"
#include <QStringList>
#include <QDateTime>
namespace onelab
{
template <typename T>
bool Troop<T>::equals(const Troop<T> &from, const Troop<T> &to)
{
int len = from.length();
if (len == to.length())
{
for (int n = 0; n < len; n++)
{
if (from.data[n] != to.data[n])
return false;
}
return true;
}
return false;
}
template <typename T>
Troop<T>::Troop()
{
mHasError = false;
}
template <typename T>
T Troop<T>::get(int index)
{
mHasError = false;
if (index >= 0 && index < data.length())
return data[index];
mHasError = true;
return (T)0;
}
template <typename T>
bool Troop<T>::set(int index, T value)
{
if (index >= 0 && index < data.length())
{
data[index] = value;
return true;
}
return false;
}
template <typename T>
void Troop<T>::append(T value)
{
data.append(value);
}
template <typename T>
bool Troop<T>::insert(int index, T value)
{
if (index >= 0 && index < data.length())
{
data.insert(index, value);
return true;
}
return false;
}
template <typename T>
void Troop<T>::appendRange(const QList<T> &range)
{
data.append(range);
}
template <typename T>
bool Troop<T>::insertRange(int index, const QList<T> &range)
{
int length = data.length();
if (index >= 0 && index < length)
{
QList<T> left = data.mid(0, index);
QList<T> right = data.mid(index, -1);
left.append(range);
data.clear();
data.append(left);
data.append(right);
return true;
}
return false;
}
template <typename T>
void Troop<T>::clear()
{
data.clear();
}
template <typename T>
bool Troop<T>::remove(int index)
{
if (index >= 0 && index < data.length())
{
data.removeAt(index);
return true;
}
return false;
}
template <typename T>
bool Troop<T>::removeRange(int index, int count)
{
if (count > 0 && index >= 0 && ((index + count) <= data.length()))
{
for (int n = 0; n < count; n++)
data.removeAt(index);
return true;
}
return false;
}
template <typename T>
int Troop<T>::length() const
{
return data.length();
}
template <typename T>
void Troop<T>::enqueue(T value)
{
data.insert(0, value);
}
template <typename T>
T Troop<T>::dequeue()
{
mHasError = false;
int length = data.length();
if (length > 0)
{
T b = data[length - 1];
data.removeAt(length - 1);
return b;
}
mHasError = true;
return (T)0;
}
template <typename T>
void Troop<T>::push(T value)
{
data.append(value);
}
template <typename T>
T Troop<T>::pop()
{
return dequeue();
}
template <typename T>
bool Troop<T>::getRange(int index, int count, Troop<T>& output)
{
mHasError = true;
if (count > 0 && index >= 0 && ((index + count) <= data.length()))
{
output.data = data.mid(index, count);
mHasError = false;
}
return mHasError;
}
template <typename T>
void Troop<T>::reverse()
{
int length = data.length();
QList<T> newData;
for (int n = length - 1; n >= 0; n--)
newData.append(data[n]);
data.clear();
data = newData;
}
template <typename T>
bool Troop<T>::swap(int index0, int index1)
{
int length = data.length();
if (index0 >= 0 && index0 < length && index1 >= 0 && index1 < length)
{
T v = data[index0];
data[index0] = data[index1];
data[index1] = v;
return true;
}
return false;
}
template <typename T>
T Troop<T>::take(int index)
{
mHasError = false;
if (index >= 0 && index < data.length())
{
T v = data[index];
data.removeAt(index);
return v;
}
mHasError = true;
return (T)0;
}
template <typename T>
void Troop<T>::rollForward(int offset)
{
if (offset >= data.length()) return;
QList<T> left = data.mid(offset - 1, -1);
QList<T> right = data.mid(0, offset - 1);
data.clear();
data.append(left);
data.append(right);
}
template <typename T>
void Troop<T>::rollBackward(int offset)
{
if (offset >= data.length()) return;
QList<T> left = data.mid(offset, -1);
QList<T> right = data.mid(0, offset);
data.clear();
data.append(left);
data.append(right);
}
template <typename T>
bool Troop<T>::operator!=(const Troop& input) const
{
return !equals(input, *this);
}
template<typename T>
bool Troop<T>::hasError() const
{
return mHasError;
}
template<typename T>
QString Troop<T>::toString()
{
return QString();
}
template<typename T>
int Troop<T>::fromString(const QString&)
{
return 0;
}
template <typename T>
bool Troop<T>::operator==(const Troop& input) const
{
return equals(input, *this);
}
}
//for more information, please access http://www.one-lab.net
package net.onelab;
import java.util.ArrayList;
public class Troop<T> implements Cloneable {
public Object clone() {
Troop<T> obj = new Troop<T>();
obj.data.addAll(data);
return obj;
}
private boolean mHasError = false;
public boolean hasError() { return mHasError; }
public ArrayList<T> data = new ArrayList<T>();
public T get(int index) {
mHasError = false;
if (index >= 0 && index < data.size())
return data.get(index);
mHasError = true;
return null;
}
public boolean set(int index, T value) {
if (index >= 0 && index < data.size())
{
data.set(index, value);
return true;
}
return false;
}
public void append(T value) {
data.add(value);
}
public boolean insert(int index, T value) {
if (index >= 0 && index < data.size())
{
data.add(index, value);
return true;
}
return false;
}
public void appendRange(ArrayList<T> range) {
data.addAll(range);
}
public boolean insertRange(int index, ArrayList<T> range) {
if (index >= 0 && index < data.size())
{
data.addAll(index, range);
return true;
}
return false;
}
public void clear() {
data.clear();
}
public boolean remove(int index) {
if (index >= 0 && index < data.size())
{
data.remove(index);
return true;
}
return false;
}
public boolean removeRange(int index, int count) {
if (count > 0 && index >= 0 && ((index + count) <= data.size()))
{
for (int n = 0; n < count; n++)
data.remove(index);
return true;
}
return false;
}
public int length() {
return data.size();
}
public void enqueue(T value) {
data.add(0, value);
}
public T dequeue() {
mHasError = false;
int length = data.size();
if (length > 0)
{
T b = data.get(length - 1);
data.remove(length - 1);
return b;
}
mHasError = true;
return null;
}
public void push(T value) {
data.add(value);
}
public T pop() {
return dequeue();
}
public Troop<T> getRange(int index, int count) {
mHasError = true;
Troop<T> output = new Troop<T>();
if (count > 0 && index >= 0 && ((index + count) <= data.size()))
{
output.data.addAll(data.subList(index, index + count));
mHasError = false;
}
return output;
}
public void reverse() {
int length = data.size();
ArrayList<T> newData = new ArrayList<T>();
for (int n = length - 1; n >= 0; n--)
newData.add(data.get(n));
data.clear();
data = newData;
}
boolean swap(int index0, int index1) {
int length = data.size();
if (index0 >= 0 && index0 < length && index1 >= 0 && index1 < length)
{
T v = data.get(index0);
data.set(index0, data.get(index1));
data.set(index1, v);
return true;
}
return false;
}
T take(int index)
{
mHasError = false;
if (index >= 0 && index < data.size())
{
T v = data.get(index);
data.remove(index);
return v;
}
mHasError = true;
return null;
}
void rollForward(int offset)
{
if (offset >= data.size()) return;
ArrayList<T> left = new ArrayList<T>();
left.addAll(data.subList(offset - 1, data.size()));
ArrayList<T> right = new ArrayList<T>();
right.addAll(data.subList(0, offset - 1));
data.clear();
data.addAll(left);
data.addAll(right);
}
void rollBackward(int offset)
{
if (offset >= data.size()) return;
ArrayList<T> left = new ArrayList<T>();
left.addAll(data.subList(offset, data.size()));
ArrayList<T> right = new ArrayList<T>();
right.addAll(data.subList(0, offset));
data.clear();
data.addAll(left);
data.addAll(right);
}
}
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Springboot+redis+Vue實(shí)現(xiàn)秒殺的項(xiàng)目實(shí)踐
本文主要介紹了Springboot+redis+Vue實(shí)現(xiàn)秒殺的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
詳解Spring Cloud Zuul中路由配置細(xì)節(jié)
本篇文章主要介紹了詳解Spring Cloud Zuul中路由配置細(xì)節(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10
JAVA內(nèi)存模型和Happens-Before規(guī)則知識點(diǎn)講解
在本篇文章里小編給大家整理的是一篇關(guān)于JAVA內(nèi)存模型和Happens-Before規(guī)則知識點(diǎn)內(nèi)容,有需要的朋友們跟著學(xué)習(xí)下。2020-11-11
解決報(bào)錯(cuò):java:讀取jar包時(shí)出錯(cuò):error in opening zip 
文章總結(jié):解決Java讀取jar包時(shí)出錯(cuò)的問題,通過下載源碼并刷新項(xiàng)目解決了問題,希望對大家有所幫助2024-11-11
一文帶你掌握J(rèn)ava?Future模式的靈活應(yīng)用
Future模式,簡單來說,就是一種能夠管理異步操作的方式,它可以讓咱們的程序在執(zhí)行一個(gè)耗時(shí)任務(wù)的同時(shí),還能繼續(xù)做其他事情,下面我們就來看看Future模式的具體應(yīng)用吧2024-01-01
Java 實(shí)現(xiàn)定時(shí)任務(wù)的三種方法
這篇文章主要介紹了Java 實(shí)現(xiàn)定時(shí)任務(wù)的三種方法,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-03-03

