自定義的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); } }
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
java如何實(shí)現(xiàn)postman中用x-www-form-urlencoded參數(shù)的請(qǐng)求
在Java開發(fā)中,模擬Postman發(fā)送x-www-form-urlencoded類型的請(qǐng)求是一個(gè)常見需求,本文主要介紹了如何在Java中實(shí)現(xiàn)這一功能,首先,需要通過導(dǎo)入http-client包來(lái)創(chuàng)建HTTP客戶端,接著,利用該客戶端發(fā)送Post請(qǐng)求2024-09-09Java使用Ajax實(shí)現(xiàn)跨域上傳圖片功能
這篇文章主要介紹了Java使用Ajax實(shí)現(xiàn)跨域上傳圖片功能,需要的朋友可以參考下2017-09-09ConstraintValidator類如何實(shí)現(xiàn)自定義注解校驗(yàn)前端傳參
這篇文章主要介紹了ConstraintValidator類實(shí)現(xiàn)自定義注解校驗(yàn)前端傳參的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06如何配置Eclipse實(shí)現(xiàn)定制登錄界面
本文介紹了如何配置Eclipse實(shí)現(xiàn)定制登錄界面,每一步的講解都很細(xì)致,感興趣的小伙伴可以閱讀一下2015-07-07Java使用RedisTemplate如何根據(jù)前綴獲取key列表
這篇文章主要介紹了Java使用RedisTemplate如何根據(jù)前綴獲取key列表,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06idea resources目錄下的application.properties不能自動(dòng)提示問題
這篇文章主要介紹了idea resources目錄下的application.properties不能自動(dòng)提示問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11利用Java實(shí)現(xiàn)網(wǎng)站聚合工具
互聯(lián)網(wǎng)上有數(shù)以萬(wàn)億計(jì)的網(wǎng)站,每個(gè)網(wǎng)站大都具有一定的功能。搜索引擎雖然對(duì)互聯(lián)網(wǎng)上的部分網(wǎng)站建立了索引,但是其作為一個(gè)大而全的搜索系統(tǒng),無(wú)法很好的定位到一些特殊的需求。因此本文將介紹一個(gè)用java實(shí)現(xiàn)的網(wǎng)站數(shù)據(jù)聚合工具,需要的可以參考一下2022-01-01SpringBoot啟動(dòng)類@SpringBootApplication注解背后的秘密
這篇文章主要介紹了SpringBoot啟動(dòng)類@SpringBootApplication注解背后的秘密,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12springboot創(chuàng)建的web項(xiàng)目整合Quartz框架的項(xiàng)目實(shí)踐
本文主要介紹了springboot創(chuàng)建的web項(xiàng)目整合Quartz框架的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06