list<T>.contains 问题改进

本文探讨了在C#中如何实现自定义类的对象比较,并通过实例展示了如何使用Equals方法来判断两个自定义对象是否相等。同时,介绍了如何在集合中查找特定类型的对象。
li.Add(new VisaDatum{ typeName= "abc", imgeurl= "123" });
li.Add(new VisaDatum{ typeName= "123", imgeurl= "abc" });

Users u = new Users();
u.typeName= li[0].typeName;
u.imgeurl=li[0].imgeurl;

if (li.Contains(u)) //怎么判断都是false
{

}

解决方案:

  public class VisaDatum
    {
        public string typeName{get;set;}
        public string imgeurl{get;set;}
        public override bool Equals(object obj)
        {
            if (typeName == (obj as VisaDatum).typeName)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }




public static void getNormalColumns(GeneratedMessageV3.Builder<?> tradeData, String tradeId, List<List<StringValue>> normalColumnsFirstLeg, List<List<StringValue>> normalColumnsSecondLeg, List<List<StringValue>> normalColumnList, List<String> normalColum) { JSONArray normalColumns = LoadConfig.externalReportConfigModel.getEodTag().getJSONArray("normalColumns"); List<String> path = IntStream.range(0, normalColumns.size()).mapToObj(normalColumns::getString).toList(); for (String fieldName : path) { Map<String, Object> normalColumnsValueMap = ProtobufTDSXUtils.parsToProtobufObject(tradeData, fieldName, false, null, tradeId); List<StringValue> values = (List<StringValue>) convertValueToString(normalColumnsValueMap, true); if (fieldName.contains("First_Leg")) { normalColumnsFirstLeg.add(values); } else if (fieldName.contains("Second_Leg")) { normalColumnsSecondLeg.add(values); } else if (fieldName.contains("List")) { normalColumnList.add(values); } else { normalColum.add((String) convertValueToString(normalColumnsValueMap, false)); } } } public static void getNormalColumnsIndex(GeneratedMessageV3.Builder<?> tradeData, String tradeId, List<String> normalColumnIndexFirstLeg, List<String> normalColumnIndexSecondLeg, List<String> normalColumnIndex) { JSONArray normalColumnsIndexArray = LoadConfig.externalReportConfigModel.getEodTag().getJSONArray("normalColumnsIndex"); List<String> normalColumnsIndexList = new ArrayList<>(IntStream.range(0, normalColumnsIndexArray.size()).mapToObj(normalColumnsIndexArray::getString).toList()); for (String midString : normalColumnsIndexList) { String subString = midString.substring(1, midString.length() - 1); int equalIndex = subString.indexOf("="); if (equalIndex != -1) { String normalColumnsIndex = subString.substring(0, equalIndex); String index = subString.substring(equalIndex + 1); Map<String, Object> stringObjectMap = ProtobufTDSXUtils.parsToProtobufObject(tradeData, normalColumnsIndex, false, index, tradeId); String value = (String) convertValueToString(stringObjectMap, false); if (subString.contains("First_Leg")) { normalColumnIndexFirstLeg.add(value); } else if (subString.contains("Second_Leg")) { normalColumnIndexSecondLeg.add(value); } else { normalColumnIndex.add(value); } } else { logger.error("NormalColumnIndex config process failed! Please check and try with right format! {}", midString); } } } 优化以上两个方法
03-20
private void ChartDt() { GetPreviousDate getPreviousDate = new GetPreviousDate(); List<string> PreviousFridayList = new List<string>(); List<string> FriNextThursdayList = new List<string>(); List<string> MonthStartList = new List<string>(); List<string> MonthEndList = new List<string>(); // 近三月三周始末日期 for (int i = 1; i <= 3; i++) { PreviousFridayList.Add(getPreviousDate.GetPreviousFriday(i).ToString("yyyyMMdd")); FriNextThursdayList.Add(getPreviousDate.GetFriNextThursday(i).ToString("yyyyMMdd")); MonthStartList.Add(getPreviousDate.GetMonthStart(i).ToString("yyyyMMdd")); MonthEndList.Add(getPreviousDate.GetMonthStart(i - 1).ToString("yyyyMMdd"));// 次月月初 } // FriNextThursdayList 处理日期 +1天 List<string> AddFriNextThursdayList = FriNextThursdayList.Select(s => { DateTime date; if (DateTime.TryParseExact(s, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out date)) { return date.AddDays(1).ToString("yyyyMMdd"); // 加1天并格式化 } else { return s; // 无效日期时返回原字符串(可选:可抛出异常或返回null) } }).ToList(); // 近七天日期 IEnumerable<DateTime> last7Days = getPreviousDate.GetLast7Days(baseDate); List<string> PreviousDayList = new List<string>(); foreach (var day in last7Days) { PreviousDayList.Add(day.ToString("yyyyMMdd")); } // 近七天日期 IEnumerable<DateTime> last7Days_ = getPreviousDate.GetLast7Days_(baseDate); List<string> PreviousDayList_ = new List<string>(); foreach (var day in last7Days_) { PreviousDayList_.Add(day.ToString("yyyyMMdd")); } #region // 周 dt List<string> WeekSqlList = new List<string>(); List<DataTable> WeekDetailsDtList = new List<DataTable>(); List<DataTable> WeekRatioDtList = new List<DataTable>(); for (int i = 0; i < 3; i++) { string sql = string.Format(@" SELECT lotid, stage, equipmentname, trackoutqty, trackintime, trackouttime, SubStr(PROCESS,2,5) tech FROM SDB_TB_WIP_TITO_HIST WHERE 1=1 AND lottype NOT IN ('C','D','V','Z','Y','L','T','X') AND equipmentname = '{0}' AND trackintime >= '{1} 073000000' AND trackintime <= '{2} 073000000' ORDER BY trackintime ", EqpSelection.Text, PreviousFridayList[i], AddFriNextThursdayList[i]); WeekSqlList.Add(sql); DataTable dt = ws.GetDataTable(Mainfrom.dataSoure, WeekSqlList[i]); WeekDetailsDtList.Add(dt); WeekRatioDtList.Add(EachDtProcess(WeekDetailsDtList[i])); } // 天 dt List<string> DaySqlList = new List<string>(); List<DataTable> DayDetailsDtList = new List<DataTable>(); List<DataTable> DayRatioDtList = new List<DataTable>(); for (int i = 0; i < 7; i++) { string sql = string.Format(@" SELECT lotid, stage, equipmentname, trackoutqty, trackintime, trackouttime, SubStr(PROCESS,2,5) tech FROM SDB_TB_WIP_TITO_HIST WHERE 1=1 AND lottype NOT IN ('C','D','V','Z','Y','L','T','X') AND equipmentname = '{0}' AND trackintime >= '{1} 073000000' AND trackintime <= '{2} 073000000' ORDER BY trackintime ", EqpSelection.Text, PreviousDayList[i], PreviousDayList_[i]); DaySqlList.Add(sql); DataTable dt = ws.GetDataTable(Mainfrom.dataSoure, DaySqlList[i]); DayDetailsDtList.Add(dt); DayRatioDtList.Add(EachDtProcess(DayDetailsDtList[i])); } // 月 dt List<string> MonthSqlList = new List<string>(); List<DataTable> MonthDetailsDtList = new List<DataTable>(); List<DataTable> MonthRatioDtList = new List<DataTable>(); for (int i = 0; i < 3; i++) { string sql = string.Format(@" SELECT lotid, stage, equipmentname, trackoutqty, trackintime, trackouttime, SubStr(PROCESS,2,5) tech FROM SDB_TB_WIP_TITO_HIST WHERE 1=1 AND lottype NOT IN ('C','D','V','Z','Y','L','T','X') AND equipmentname = '{0}' AND trackintime >= '{1} 073000000' AND trackintime <= '{2} 073000000' ORDER BY trackintime ", EqpSelection.Text, MonthStartList[i], MonthEndList[i]); MonthSqlList.Add(sql); DataTable dt = ws.GetDataTable(Mainfrom.dataSoure, MonthSqlList[i]); MonthDetailsDtList.Add(dt); MonthRatioDtList.Add(EachDtProcess(MonthDetailsDtList[i])); } //List<List<int>> CountList = new List<List<int>>(); //List<int> tempList = new List<int>(); //for (int i = 0; i < MdtRatioList.Count; i++ ) //{ // tempList.Clear(); // foreach (DataRow row in MdtRatioList[i].Rows) // { // int num = row.Field<int>("Count"); // tempList.Add(num); // } // CountList.Add(tempList); //} // // 单机台周平均 // // 遍历 周 Ratio dt Count列 List<List<object>> WeekCountList = new List<List<object>>(); foreach (DataTable dt in WeekRatioDtList) { // 验证列存在性 if (!dt.Columns.Contains("Count")) continue; // 创建当前表的存储列表 List<object> currentTableData = new List<object>(); // 遍历行并提取数据 foreach (DataRow row in dt.Rows) { object value = row["Count"]; currentTableData.Add(value == DBNull.Value ? null : value); } WeekCountList.Add(currentTableData); } // 合并123批 List<List<int>> WeekMergeList = new List<List<int>>(); foreach (List<object> subList in WeekCountList) { List<int> processed = new List<int>(); // 计算前三个有效数字的和(自动跳过null值) int sum = subList.Take(3) .Where(x => x != null) .Sum(x => Convert.ToInt32(x)); processed.Add(sum); // 添加后续元素(自动转换并跳过null) processed.AddRange(subList.Skip(3) .Where(x => x != null) .Select(x => Convert.ToInt32(x))); WeekMergeList.Add(processed); } List<List<double>> WeekRatioList = new List<List<double>>(); foreach (List<int> subList in WeekMergeList) { // 提取合格数和不合格数 int qualified = subList[0]; int unqualified = subList[1]; // 计算总数(带防零处理) int total = qualified + unqualified; if (total == 0) { WeekRatioList.Add(new List<double> { 0.0, 0.0 }); continue; } // 计算比率(保留两位小数) double qualifiedRate = Math.Round(qualified * 1.00 / total, 2); double unqualifiedRate = Math.Round(unqualified * 1.00 / total, 2); // 比率平衡处理(确保总和为100%) if (qualifiedRate + unqualifiedRate != 1.00) { qualifiedRate = 1.00 - unqualifiedRate; } WeekRatioList.Add(new List<double> { qualifiedRate, unqualifiedRate }); } #endregion // 今天的 ISO周 string TODAY = CustomWeekFormatter.GetCustomWeek(baseDate); // 前周五的 ISO周 List<string> preFriWeek = new List<string>(); foreach (string weekdate in PreviousFridayList) { preFriWeek.Add(CustomWeekFormatter.ConvertYyyyMmDdToWeek(weekdate)); } // 前周五的下周四 ISO周 List<string> preNextThuWeek = new List<string>(); foreach (string weekdate in FriNextThursdayList) { preNextThuWeek.Add(CustomWeekFormatter.ConvertYyyyMmDdToWeek(weekdate)); } // 合成新 DT表 DataTable WeekRatioOverviewTable = new DataTable("QualityStats"); WeekRatioOverviewTable.Columns.Add("Date", typeof(string)); WeekRatioOverviewTable.Columns.Add("Qualified", typeof(int)); WeekRatioOverviewTable.Columns.Add("Unqualified", typeof(int)); WeekRatioOverviewTable.Columns.Add("PassRate", typeof(double)); WeekRatioOverviewTable.Columns.Add("FailureRate", typeof(double)); // 检查列表长度是否一致 if (preFriWeek.Count != WeekMergeList.Count || WeekMergeList.Count != WeekRatioList.Count) { throw new ArgumentException("所有列表长度必须相同"); } // 合并数据到DataTable for (int i = 0; i < preFriWeek.Count; i++) { DataRow newRow = WeekRatioOverviewTable.NewRow(); newRow["Date"] = preFriWeek[i]; newRow["Qualified"] = WeekMergeList[i][0]; // 合格数 newRow["Unqualified"] = WeekMergeList[i][1]; // 不合格数 newRow["PassRate"] = WeekRatioList[i][0]; // 合格率 newRow["FailureRate"] = WeekRatioList[i][1]; // 不合格率 WeekRatioOverviewTable.Rows.Add(newRow); } //// 周绑定数据 //chartControl2.DataSource = WeekRatioOverviewTable; //chartControl2.Series[0].ArgumentDataMember = "Date"; //chartControl2.Series[0].ValueDataMembers[0] = "Qualified"; //chartControl2.Series[1].ArgumentDataMember = "Date"; //chartControl2.Series[1].ValueDataMembers[0] = "UnQualified"; //chartControl2.Series[2].ArgumentDataMember = "Date"; //chartControl2.Series[2].ValueDataMembers[0] = "PassRate"; //chartControl2.Series[3].ArgumentDataMember = "Date"; //chartControl2.Series[3].ValueDataMembers[0] = "FailureRate"; // // 单机台月平均 // // 遍历 周 Ratio dt Count列 List<List<object>> MonthCountList = new List<List<object>>(); foreach (DataTable dt in MonthRatioDtList) { // 验证列存在性 if (!dt.Columns.Contains("Count")) continue; // 创建当前表的存储列表 List<object> currentTableData = new List<object>(); // 遍历行并提取数据 foreach (DataRow row in dt.Rows) { object value = row["Count"]; currentTableData.Add(value == DBNull.Value ? null : value); } MonthCountList.Add(currentTableData); } // 合并123批 List<List<int>> MonthMergeList = new List<List<int>>(); foreach (List<object> subList in MonthCountList) { List<int> processed = new List<int>(); // 计算前三个有效数字的和(自动跳过null值) int sum = subList.Take(3) .Where(x => x != null) .Sum(x => Convert.ToInt32(x)); processed.Add(sum); // 添加后续元素(自动转换并跳过null) processed.AddRange(subList.Skip(3) .Where(x => x != null) .Select(x => Convert.ToInt32(x))); MonthMergeList.Add(processed); } List<List<double>> MonthRatioList = new List<List<double>>(); foreach (List<int> subList in MonthMergeList) { // 提取合格数和不合格数 int qualified = subList[0]; int unqualified = subList[1]; // 计算总数(带防零处理) int total = qualified + unqualified; if (total == 0) { MonthRatioList.Add(new List<double> { 0.0, 0.0 }); continue; } // 计算比率(保留两位小数) double qualifiedRate = Math.Round(qualified * 1.00 / total, 2); double unqualifiedRate = Math.Round(unqualified * 1.00 / total, 2); // 比率平衡处理(确保总和为100%) if (qualifiedRate + unqualifiedRate != 1.00) { qualifiedRate = 1.00 - unqualifiedRate; } MonthRatioList.Add(new List<double> { qualifiedRate, unqualifiedRate }); } // 截取操作:从索引2开始取4位(yyMM) List<string> preMonth = MonthStartList .Select(s => s.Substring(2, 4)) .ToList(); // 合成新 DT表 DataTable MonthRatioOverviewTable = new DataTable("QualityStats"); MonthRatioOverviewTable.Columns.Add("Date", typeof(string)); MonthRatioOverviewTable.Columns.Add("Qualified", typeof(int)); MonthRatioOverviewTable.Columns.Add("Unqualified", typeof(int)); MonthRatioOverviewTable.Columns.Add("PassRate", typeof(double)); MonthRatioOverviewTable.Columns.Add("FailureRate", typeof(double)); // 检查列表长度是否一致 if (preMonth.Count != MonthMergeList.Count || MonthMergeList.Count != MonthRatioList.Count) { throw new ArgumentException("所有列表长度必须相同"); } // 合并数据到DataTable for (int i = 0; i < preMonth.Count; i++) { DataRow newRow = MonthRatioOverviewTable.NewRow(); newRow["Date"] = preMonth[i]; newRow["Qualified"] = MonthMergeList[i][0]; // 合格数 newRow["Unqualified"] = MonthMergeList[i][1]; // 不合格数 newRow["PassRate"] = MonthRatioList[i][0]; // 合格率 newRow["FailureRate"] = MonthRatioList[i][1]; // 不合格率 MonthRatioOverviewTable.Rows.Add(newRow); } // // // // 单机台天平均 // // 遍历 周 Ratio dt Count列 List<List<object>> DayCountList = new List<List<object>>(); foreach (DataTable dt in DayRatioDtList) { // 验证列存在性 if (!dt.Columns.Contains("Count")) continue; // 创建当前表的存储列表 List<object> currentTableData = new List<object>(); // 遍历行并提取数据 foreach (DataRow row in dt.Rows) { object value = row["Count"]; currentTableData.Add(value == DBNull.Value ? null : value); } DayCountList.Add(currentTableData); } // 合并123批 List<List<int>> DayMergeList = new List<List<int>>(); foreach (List<object> subList in DayCountList) { List<int> processed = new List<int>(); // 计算前三个有效数字的和(自动跳过null值) int sum = subList.Take(3) .Where(x => x != null) .Sum(x => Convert.ToInt32(x)); processed.Add(sum); // 添加后续元素(自动转换并跳过null) processed.AddRange(subList.Skip(3) .Where(x => x != null) .Select(x => Convert.ToInt32(x))); DayMergeList.Add(processed); } List<List<double>> DayRatioList = new List<List<double>>(); foreach (List<int> subList in DayMergeList) { // 提取合格数和不合格数 int qualified = subList[0]; int unqualified = subList[1]; // 计算总数(带防零处理) int total = qualified + unqualified; if (total == 0) { DayRatioList.Add(new List<double> { 0.0, 0.0 }); continue; } // 计算比率(保留两位小数) double qualifiedRate = Math.Round(qualified * 1.00 / total, 2); double unqualifiedRate = Math.Round(unqualified * 1.00 / total, 2); // 比率平衡处理(确保总和为100%) if (qualifiedRate + unqualifiedRate != 1.00) { qualifiedRate = 1.00 - unqualifiedRate; } DayRatioList.Add(new List<double> { qualifiedRate, unqualifiedRate }); } // 截取操作:从索引2开始取4位(yyMM) List<string> preDay = PreviousDayList; //.Select(s => s.Substring(2, 4)) //.ToList(); // 合成新 DT表 DataTable DayRatioOverviewTable = new DataTable("QualityStats"); DayRatioOverviewTable.Columns.Add("Date", typeof(string)); DayRatioOverviewTable.Columns.Add("Qualified", typeof(int)); DayRatioOverviewTable.Columns.Add("Unqualified", typeof(int)); DayRatioOverviewTable.Columns.Add("PassRate", typeof(double)); DayRatioOverviewTable.Columns.Add("FailureRate", typeof(double)); // 检查列表长度是否一致 if (preDay.Count != DayMergeList.Count || DayMergeList.Count != DayRatioList.Count) { throw new ArgumentException("所有列表长度必须相同"); } // 合并数据到DataTable for (int i = 0; i < preDay.Count; i++) { DataRow newRow = DayRatioOverviewTable.NewRow(); newRow["Date"] = preDay[i]; newRow["Qualified"] = DayMergeList[i][0]; // 合格数 newRow["Unqualified"] = DayMergeList[i][1]; // 不合格数 newRow["PassRate"] = DayRatioList[i][0]; // 合格率 newRow["FailureRate"] = DayRatioList[i][1]; // 不合格率 DayRatioOverviewTable.Rows.Add(newRow); } // 合并 DataTable 并添加分隔符 DataTable mergedTable = MergeDataTablesWithSeparator(MonthRatioOverviewTable, WeekRatioOverviewTable, DayRatioOverviewTable); // 绑定数据 chartControl2.DataSource = mergedTable; chartControl2.Series[0].ArgumentDataMember = "Date"; chartControl2.Series[0].ValueDataMembers[0] = "Qualified"; chartControl2.Series[1].ArgumentDataMember = "Date"; chartControl2.Series[1].ValueDataMembers[0] = "UnQualified"; chartControl2.Series[2].ArgumentDataMember = "Date"; chartControl2.Series[2].ValueDataMembers[0] = "PassRate"; chartControl2.Series[3].ArgumentDataMember = "Date"; chartControl2.Series[3].ValueDataMembers[0] = "FailureRate"; } 优化这部分代码,减少行数提升可读性,并提高效率
最新发布
07-17
package com.example.kucun2.entity.data; import android.annotation.SuppressLint; import android.util.Log; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ListIterator; /** * 支持数据变更自动同步的泛型集合类 * 基于SynchronizableEntity的事件机制实现数据变更自动同步 * * @param <T> 必须是SynchronizableEntity或其子类 */ public class SynchronizedList<T extends SynchronizableEntity> implements List<T> { // 使用ArrayList作为底层存储 private final List<T> list = new ArrayList<>(); public Class<T> getEntityType() { return entityType; } private Class<T> entityType; public SynchronizedList(Class<T> T) { this.entityType = T; } // 实体变更监听器 private final EntityChangeListener<T> entityChangeListener = new EntityChangeListener<>(); @Override public int size() { return list.size(); } @Override public boolean isEmpty() { return list.isEmpty(); } @Override public boolean contains(Object o) { return list.contains(o); } @Override public Iterator<T> iterator() { return new SyncedIterator<>(list.iterator(), entityChangeListener); } @Override public Object[] toArray() { return list.toArray(); } @Override public <E> E[] toArray(E[] a) { return list.toArray(a); } // 添加元素时注册监听器 @SuppressLint("SuspiciousIndentation") // 在 SynchronizedList 类中修改添加方法 @Override public boolean add(T element) { if (element != null && !list.contains(element)) { element.addPropertyChangeListener(entityChangeListener); boolean added = list.add(element); // 如果是新实体并且同步功能开启,则触发同步 if (added && syncEnabled /*报红没定义*/&& element.getState() == SynchronizableEntity.SyncState.NEW) { element.syncWithDependencies(new SynchronizableEntity.SyncCallback() { @Override public void onSyncSuccess(SynchronizableEntity entity) { Log.d("Sync", "Successfully synced new entity: " + entity); } @Override public void onSyncFailure(String error) { Log.e("Sync", "Failed to sync new entity: " + error); } }); } return added; } return false; } // 移除元素时注销监听器 @Override public boolean remove(Object o) { if (o instanceof SynchronizableEntity) { ((SynchronizableEntity) o).removePropertyChangeListener(entityChangeListener); } return list.remove(o); } @Override public boolean containsAll(Collection<?> c) { return list.containsAll(c); } // 批量添加时逐个注册监听器 @Override public boolean addAll(Collection<? extends T> c) { for (T element : c) { if (element != null) { element.addPropertyChangeListener(entityChangeListener); } } return list.addAll(c); } @Override public boolean addAll(int index, Collection<? extends T> c) { for (T element : c) { if (element != null) { element.addPropertyChangeListener(entityChangeListener); } } return list.addAll(index, c); } // 批量移除时逐个注销监听器 @Override public boolean removeAll(Collection<?> c) { for (Object o : c) { if (o instanceof SynchronizableEntity) { ((SynchronizableEntity) o).removePropertyChangeListener(entityChangeListener); } } return list.removeAll(c); } @Override public boolean retainAll(Collection<?> c) { // 先移除未保留元素的监听器 for (T element : list) { if (!c.contains(element)) { element.removePropertyChangeListener(entityChangeListener); } } return list.retainAll(c); } // 清空集合时移除所有监听器 @Override public void clear() { for (T element : list) { element.removePropertyChangeListener(entityChangeListener); } list.clear(); } @Override public T get(int index) { return list.get(index); } // 替换元素时更新监听器 @Override public T set(int index, T element) { T oldElement = list.get(index); if (oldElement != null) { oldElement.removePropertyChangeListener(entityChangeListener); } if (element != null) { element.addPropertyChangeListener(entityChangeListener); } return list.set(index, element); } // 在指定位置添加元素时注册监听器 @Override public void add(int index, T element) { if (element != null && !list.contains(element)) { element.addPropertyChangeListener(entityChangeListener); list.add(index, element); } } // 移除元素时注销监听器 @Override public T remove(int index) { T removed = list.remove(index); if (removed != null) { removed.removePropertyChangeListener(entityChangeListener); } return removed; } @Override public int indexOf(Object o) { return list.indexOf(o); } @Override public int lastIndexOf(Object o) { return list.lastIndexOf(o); } @Override public ListIterator<T> listIterator() { return new SyncedListIterator<>(list.listIterator(), entityChangeListener); } @Override public ListIterator<T> listIterator(int index) { return new SyncedListIterator<>(list.listIterator(index), entityChangeListener); } @Override public List<T> subList(int fromIndex, int toIndex) { return list.subList(fromIndex, toIndex); } /** * 内部实体变更监听器 * 监听属性变化并触发同步操作 */ private static class EntityChangeListener<T extends SynchronizableEntity> implements PropertyChangeListener { @Override public void propertyChange(PropertyChangeEvent evt) { @SuppressWarnings("unchecked") T entity = (T) evt.getSource(); entity.sync(null); // 触发同步操作 } } /** * 增强的Iterator实现 * 移除元素时自动注销监听器 */ private static class SyncedIterator<T extends SynchronizableEntity> implements Iterator<T> { private final Iterator<T> iterator; private final EntityChangeListener<T> listener; private T current; public SyncedIterator(Iterator<T> iterator, EntityChangeListener<T> listener) { this.iterator = iterator; this.listener = listener; } @Override public boolean hasNext() { return iterator.hasNext(); } @Override public T next() { current = iterator.next(); return current; } @Override public void remove() { if (current != null) { current.removePropertyChangeListener(listener); } iterator.remove(); } } /** * 增强的ListIterator实现 * 支持添加/设置元素时的监听器管理 */ private static class SyncedListIterator<T extends SynchronizableEntity> implements ListIterator<T> { private final ListIterator<T> iterator; private final EntityChangeListener<T> listener; private T lastReturned; public SyncedListIterator(ListIterator<T> iterator, EntityChangeListener<T> listener) { this.iterator = iterator; this.listener = listener; } @Override public boolean hasNext() { return iterator.hasNext(); } @Override public T next() { lastReturned = iterator.next(); return lastReturned; } @Override public boolean hasPrevious() { return iterator.hasPrevious(); } @Override public T previous() { lastReturned = iterator.previous(); return lastReturned; } @Override public int nextIndex() { return iterator.nextIndex(); } @Override public int previousIndex() { return iterator.previousIndex(); } @Override public void remove() { if (lastReturned != null) { lastReturned.removePropertyChangeListener(listener); } iterator.remove(); } @Override public void set(T e) { if (lastReturned != null) { lastReturned.removePropertyChangeListener(listener); } if (e != null) { e.addPropertyChangeListener(listener); } iterator.set(e); lastReturned = e; } @Override public void add(T e) { if (e != null) { e.addPropertyChangeListener(listener); } iterator.add(e); } } }
06-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值