58、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

在Java中,当两个对象equals相等时,它们的hashCode通常应该相同。这是为了保证对象在哈希表如HashMap中的正确行为。然而,题述情况不正确,因为如果两个对象值相等,它们的hashCode也应该相等。这个问题可能出现在面试中,考察对Java对象标识性的理解。

58、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

不对,有相同的hash code。

JAVA面试问题及答案大全

package com.tongchuang.realtime.mds; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.tongchuang.realtime.bean.ULEParamConfig; import com.tongchuang.realtime.util.KafkaUtils; import org.apache.flink.api.common.eventtime.WatermarkStrategy; import org.apache.flink.api.common.state.; import org.apache.flink.api.common.time.Time; import org.apache.flink.api.common.typeinfo.BasicTypeInfo; import org.apache.flink.api.common.typeinfo.TypeInformation; import org.apache.flink.configuration.Configuration; import org.apache.flink.connector.kafka.source.KafkaSource; import org.apache.flink.connector.kafka.source.enumerator.initializer.OffsetsInitializer; import org.apache.flink.streaming.api.datastream.; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.functions.co.KeyedBroadcastProcessFunction; import org.apache.flink.streaming.api.functions.source.RichSourceFunction; import org.apache.flink.util.Collector; import org.apache.flink.util.OutputTag; import java.io.Serializable; import java.sql.; import java.text.SimpleDateFormat; import java.util.; import java.util.Date; import java.util.concurrent.TimeUnit; public class ULEDataanomalyanalysis { public static void main(String[] args) throws Exception { final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); // 创建Kafka消费者 KafkaSource kafkaConsumer = KafkaUtils.getKafkaConsumer( “realdata_minute”, “minutedata_uledataanomalyanalysis”, OffsetsInitializer.latest() ); DataStreamSource kafkaDS = env.fromSource( kafkaConsumer, WatermarkStrategy.noWatermarks(), “realdata_uledataanomalyanalysis” ); kafkaDS.print(“分钟数据流”); // 解析JSON并拆分每个tag的数据 SingleOutputStreamOperator splitStream = kafkaDS .map(JSON::parseObject) .flatMap((JSONObject value, Collector out) -> { JSONObject data = value.getJSONObject(“datas”); String time = value.getString(“times”); for (String tag : data.keySet()) { JSONObject tagData = data.getJSONObject(tag); JSONObject newObj = new JSONObject(); newObj.put(“time”, time); newObj.put(“tag”, tag); newObj.put(“ontime”, tagData.getDouble(“ontime”)); newObj.put(“avg”, tagData.getDouble(“avg”)); out.collect(newObj); } }) .returns(TypeInformation.of(JSONObject.class)) .name(“Split-By-Tag”); // 每5分钟加载参数配置 DataStream configDataStream = env .addSource(new MysqlConfigSource()) .setParallelism(1) .filter(Objects::nonNull) .name(“Config-Source”); // 将配置流转换为广播流 BroadcastStream configBroadcastStream = configDataStream .broadcast(Descriptors.configStateDescriptor); // 按tag分组并连接广播流 KeyedStream<JSONObject, String> keyedStream = splitStream .keyBy(json -> json.getString(“tag”)); BroadcastConnectedStream<JSONObject, ConfigCollection> connectedStream = keyedStream.connect(configBroadcastStream); // 异常检测处理 SingleOutputStreamOperator anomalyStream = connectedStream .process(new OptimizedAnomalyDetectionFunction()) .name(“Anomaly-Detection”); anomalyStream.print(“异常检测结果”); // anomalyStream.map(JSON::toString).addSink(KafkaUtils.getKafkaSink(“minutedata_uleanomaly”)); env.execute(“uledataanomalyanalysis”); } // 配置集合类 - 添加检查点时间 public static class ConfigCollection implements Serializable { private static final long serialVersionUID = 1L; public final Map<String, List> tagToConfigs; public final Map<String, ULEParamConfig> encodeToConfig; public final Set allTags; public final long checkpointTime; // 配置加载的时间戳 public ConfigCollection(Map<String, List> tagToConfigs, Map<String, ULEParamConfig> encodeToConfig) { this.tagToConfigs = new HashMap<>(tagToConfigs); this.encodeToConfig = new HashMap<>(encodeToConfig); this.allTags = new HashSet<>(tagToConfigs.keySet()); this.checkpointTime = System.currentTimeMillis(); // 记录配置加载时间 } } // MySQL配置源 public static class MysqlConfigSource extends RichSourceFunction { private volatile boolean isRunning = true; private final long interval = TimeUnit.MINUTES.toMillis(5); @Override public void run(SourceContext ctx) throws Exception { while (isRunning) { ConfigCollection newConfig = loadParams(); if (newConfig != null) { ctx.collect(newConfig); System.out.println("配置加载完成,检查点时间: " + new Date(newConfig.checkpointTime)); } else { System.out.println(“配置加载失败”); } Thread.sleep(interval); } } private ConfigCollection loadParams() { Map<String, List> tagToConfigs = new HashMap<>(5000); Map<String, ULEParamConfig> encodeToConfig = new HashMap<>(5000); String url = “jdbc:mysql://10.51.37.73:3306/eps?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8”; String user = “root”; String password = “6CKIm5jDVsLrahSw”; String query = "SELECT F_tag AS tag, F_enCode AS encode, F_dataTypes AS datatype, " + "F_isConstantValue AS constantvalue, F_isOnline AS isonline, " + "F_isSync AS issync, F_syncParaEnCode AS syncparaencode, " + "F_isZero AS iszero, F_isHigh AS ishigh, F_highThreshold AS highthreshold, " + "F_isLow AS islow, F_lowThreshold AS lowthreshold, F_duration AS duration " + "FROM t_equipmentparameter " + "WHERE F_enabledmark = ‘1’ AND (F_isConstantValue =‘1’ OR F_isZero= ‘1’ " + “OR F_isHigh = ‘1’ OR F_isLow = ‘1’ OR F_isOnline = ‘1’ OR F_isSync = ‘1’)”; try (Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(query)) { while (rs.next()) { ULEParamConfig config = new ULEParamConfig(); config.tag = rs.getString(“tag”); config.encode = rs.getString(“encode); config.datatype = rs.getString(“datatype”); config.constantvalue = rs.getInt(“constantvalue”); config.iszero = rs.getInt(“iszero”); config.ishigh = rs.getInt(“ishigh”); config.highthreshold = rs.getDouble(“highthreshold”); config.islow = rs.getInt(“islow”); config.lowthreshold = rs.getDouble(“lowthreshold”); config.duration = rs.getLong(“duration”); config.isonline = rs.getInt(“isonline”); config.issync = rs.getInt(“issync”); config.syncparaencode = rs.getString(“syncparaencode); // 跳过无效配置 if (config.encode == null || config.encode.isEmpty()) { System.err.println(“忽略无效配置: 空encode); continue; } String tag = config.tag; tagToConfigs.computeIfAbsent(tag, k -> new ArrayList<>(10)).add(config); encodeToConfig.put(config.encode, config); } System.out.println(“加载配置: " + encodeToConfig.size() + " 个参数”); return new ConfigCollection(tagToConfigs, encodeToConfig); } catch (SQLException e) { System.err.println(“加载参数配置错误:”); e.printStackTrace(); return null; } } @Override public void cancel() { isRunning = false; } } // 状态描述符 public static class Descriptors { public static final MapStateDescriptor<Void, ConfigCollection> configStateDescriptor = new MapStateDescriptor<>( “configState”, TypeInformation.of(Void.class), TypeInformation.of(ConfigCollection.class) ); } // 优化后的异常检测函数(无定时器实现) public static class OptimizedAnomalyDetectionFunction extends KeyedBroadcastProcessFunction<String, JSONObject, ConfigCollection, JSONObject> { // 状态管理 private transient MapState<String, AnomalyState> stateMap; // key=encode private transient MapState<String, Double> lastValuesMap; // key=tag private transient MapState<String, Long> lastDataTimeMap; // key=tag private transient ValueState lastCheckpointState; // 记录该tag上次处理的检查点时间 private transient SimpleDateFormat timeFormat; // 日志频率控制 private transient long lastSyncLogTime = 0; // 侧输出标签用于离线检测 private static final OutputTag OFFLINE_CHECK_TAG = new OutputTag(“offline-check”){}; @Override public void open(Configuration parameters) { // 状态TTL配置(30天自动清理) StateTtlConfig ttlConfig = StateTtlConfig.newBuilder(Time.days(300)) .setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite) .setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired) .cleanupFullSnapshot() .build(); // 初始化异常状态存储(启用TTL) MapStateDescriptor<String, AnomalyState> stateDesc = new MapStateDescriptor<>( “anomalyState”, BasicTypeInfo.STRING_TYPE_INFO, TypeInformation.of(AnomalyState.class) ); stateDesc.enableTimeToLive(ttlConfig); stateMap = getRuntimeContext().getMapState(stateDesc); // 初始化最新存储(启用TTL) MapStateDescriptor<String, Double> valuesDesc = new MapStateDescriptor<>( “lastValuesState”, BasicTypeInfo.STRING_TYPE_INFO, BasicTypeInfo.DOUBLE_TYPE_INFO ); valuesDesc.enableTimeToLive(ttlConfig); lastValuesMap = getRuntimeContext().getMapState(valuesDesc); // 初始化最后数据时间存储(启用TTL) MapStateDescriptor<String, Long> timeDesc = new MapStateDescriptor<>( “lastDataTimeState”, BasicTypeInfo.STRING_TYPE_INFO, BasicTypeInfo.LONG_TYPE_INFO ); timeDesc.enableTimeToLive(ttlConfig); lastDataTimeMap = getRuntimeContext().getMapState(timeDesc); // 初始化检查点状态(记录上次处理的配置时间) ValueStateDescriptor checkpointDesc = new ValueStateDescriptor<>( “lastCheckpointState”, BasicTypeInfo.LONG_TYPE_INFO ); checkpointDesc.enableTimeToLive(ttlConfig); lastCheckpointState = getRuntimeContext().getState(checkpointDesc); timeFormat = new SimpleDateFormat(“yyyy-MM-dd HH:mm”); } @Override public void processElement(JSONObject data, ReadOnlyContext ctx, Collector out) throws Exception { String tag = ctx.getCurrentKey(); String timeStr = data.getString(“time”); long eventTime = timeFormat.parse(timeStr).getTime(); // 更新最后数据时间 lastDataTimeMap.put(tag, eventTime); // 获取广播配置 ConfigCollection configCollection = getBroadcastConfig(ctx); if (configCollection == null) { return; } List configs = configCollection.tagToConfigs.get(tag); if (configs == null || configs.isEmpty()) { return; } // 跟踪已恢复的tag Set recoveredTags = new HashSet<>(); // ========== 清理无效状态 ========== // 修复:使用临时列表避免ConcurrentModificationException List keysToRemove = new ArrayList<>(); for (String encode : stateMap.keys()) { boolean found = false; for (ULEParamConfig cfg : configs) { if (cfg.encode.equals(encode)) { found = true; break; } } if (!found) { System.out.println("清理过期状态: " + encode); keysToRemove.add(encode); } } for (String encode : keysToRemove) { stateMap.remove(encode); } // ========== 检查离线状态(基于配置检查点) ========== Long lastCP = lastCheckpointState.value(); if (lastCP == null || configCollection.checkpointTime > lastCP) { // 新配置到达,检查离线状态 for (ULEParamConfig config : configs) { if (config.isonline == 1) { // 获取该tag的最后数据时间 Long lastEventTime = lastDataTimeMap.get(tag); if (lastEventTime == null) { // 从未收到数据,触发离线报警 AnomalyState state = getOrCreateState(config.encode); AnomalyStatus status = state.getStatus(5); if (!status.reported) { // 使用超时时间点作为触发时间 long timeoutPoint = configCollection.checkpointTime; String triggerTime = timeFormat.format(new Date(timeoutPoint)); reportAnomaly(5, 1, 0.0, triggerTime, config, out); status.reported = true; stateMap.put(config.encode, state); } } else { // 计算超时时间点:检查点时间 - duration long timeoutPoint = configCollection.checkpointTime - config.duration * 60 * 1000; if (lastEventTime < timeoutPoint) { // 触发离线报警 AnomalyState state = getOrCreateState(config.encode); AnomalyStatus status = state.getStatus(5); if (!status.reported) { // 使用超时时间点作为触发时间 String triggerTime = timeFormat.format(new Date(timeoutPoint)); reportAnomaly(5, 1, 0.0, triggerTime, config, out); status.reported = true; stateMap.put(config.encode, state); } } } } } // 更新检查点状态 lastCheckpointState.update(configCollection.checkpointTime); } double value = 0; boolean valueSet = false; // 遍历配置项进行异常检测 for (ULEParamConfig config : configs) { if (!valueSet) { value = “436887485805570949”.equals(config.datatype) ? data.getDouble(“ontime”) : data.getDouble(“avg”); lastValuesMap.put(tag, value); valueSet = true; } // 获取或初始化状态 AnomalyState state = getOrCreateState(config.encode); // ========== 离线恢复检测 ========== if (config.isonline == 1) { AnomalyStatus status = state.getStatus(5); if (status.reported) { // 设备重新上线,发送恢复事件 if (!recoveredTags.contains(tag)) { // 使用当前系统时间作为恢复时间 String recoveryTime = timeFormat.format(new Date()); reportAnomaly(5, 0, 0.0, recoveryTime, config, out); status.reset(); recoveredTags.add(tag); // 标记该tag已恢复 System.out.println(“设备 " + tag + " 恢复在线”); } } } // 处理异常类型 checkConstantValueAnomaly(config, value, timeStr, state, out); checkZeroValueAnomaly(config, value, timeStr, state, out); checkThresholdAnomaly(config, value, timeStr, state, out); checkSyncAnomaly(config, value, timeStr, state, configCollection, out); // 保存状态 stateMap.put(config.encode, state); } } // 恒检测 private void checkConstantValueAnomaly(ULEParamConfig config, double currentValue, String timeStr, AnomalyState state, Collector out) { if (config.constantvalue != 1) return; try { AnomalyStatus status = state.getStatus(1); long durationThreshold = config.duration * 60 * 1000; Date timestamp = timeFormat.parse(timeStr); if (status.lastValue == null) { status.lastValue = currentValue; status.lastChangeTime = timestamp; return; } if (Math.abs(currentValue - status.lastValue) > 0.001) { status.lastValue = currentValue; status.lastChangeTime = timestamp; if (status.reported) { reportAnomaly(1, 0, currentValue, timeStr, config, out); } status.reset(); return; } long elapsed = timestamp.getTime() - status.lastChangeTime.getTime(); if (elapsed > durationThreshold) { if (!status.reported) { reportAnomaly(1, 1, currentValue, timeStr, config, out); status.reported = true; } } } catch (Exception e) { System.err.println("恒检测错误: " + config.encode + " - " + e.getMessage()); } } // 零检测 private void checkZeroValueAnomaly(ULEParamConfig config, double currentValue, String timeStr, AnomalyState state, Collector out) { if (config.iszero != 1) return; try { AnomalyStatus status = state.getStatus(2); Date timestamp = timeFormat.parse(timeStr); boolean isZero = Math.abs(currentValue) < 0.001; if (isZero) { if (status.startTime == null) { status.startTime = timestamp; } else if (!status.reported) { long elapsed = timestamp.getTime() - status.startTime.getTime(); if (elapsed >= config.duration * 60 * 1000) { reportAnomaly(2, 1, currentValue, timeStr, config, out); status.reported = true; } } } else { if (status.reported) { reportAnomaly(2, 0, currentValue, timeStr, config, out); status.reset(); } else if (status.startTime != null) { status.startTime = null; } } } catch (Exception e) { System.err.println("零检测错误: " + config.encode + " - "+e.getMessage()); } } // 阈检测 private void checkThresholdAnomaly(ULEParamConfig config, double currentValue, String timeStr, AnomalyState state, Collector out) { try { if (config.ishigh == 1) { AnomalyStatus highStatus = state.getStatus(3); processThresholdAnomaly(highStatus, currentValue, timeStr, currentValue > config.highthreshold, config, 3, out); } if (config.islow == 1) { AnomalyStatus lowStatus = state.getStatus(4); processThresholdAnomaly(lowStatus, currentValue, timeStr, currentValue < config.lowthreshold, config, 4, out); } } catch (Exception e) { System.err.println("阈检测错误: " + config.encode + " - " + e.getMessage()); } } private void processThresholdAnomaly(AnomalyStatus status, double currentValue, String timeStr, boolean isAnomaly, ULEParamConfig config, int anomalyType, Collector out) { try { Date timestamp = timeFormat.parse(timeStr); if (isAnomaly) { if (status.startTime == null) { status.startTime = timestamp; } else if (!status.reported) { long elapsed = timestamp.getTime() - status.startTime.getTime(); if (elapsed >= config.duration * 60 * 1000) { reportAnomaly(anomalyType, 1, currentValue, timeStr, config, out); status.reported = true; } } } else { if (status.reported) { reportAnomaly(anomalyType, 0, currentValue, timeStr, config, out); status.reset(); } else if (status.startTime != null) { status.startTime = null; } } } catch (Exception e) { System.err.println("阈处理错误: " + config.encode + " - " + e.getMessage()); } } // 同步检测 - 优化实现 private void checkSyncAnomaly(ULEParamConfig config, double currentValue, String timeStr, AnomalyState state, ConfigCollection configCollection, Collector out) { if (config.issync != 1 || config.syncparaencode == null) return; try { // 日志频率控制:每分钟最多打印一次 long now = System.currentTimeMillis(); if (now - lastSyncLogTime > 60000) { System.out.println("同步检测 - 当前配置: " + config); lastSyncLogTime = now; } AnomalyStatus status = state.getStatus(6); Date timestamp = timeFormat.parse(timeStr); // 直接获取关联配置 ULEParamConfig relatedConfig = configCollection.encodeToConfig.get(config.syncparaencode); if (relatedConfig == null) { System.out.println(“同步检测: 未找到关联配置, encode=” + config.syncparaencode); return; } // 查找关联tag String relatedTag = null; for (Map.Entry<String, List> entry : configCollection.tagToConfigs.entrySet()) { for (ULEParamConfig cfg : entry.getValue()) { if (cfg.encode.equals(relatedConfig.encode)) { relatedTag = entry.getKey(); break; } } if (relatedTag != null) break; } if (relatedTag == null) { System.out.println(“同步检测: 未找到关联Tag,关联encode=” + relatedConfig.encode); return; } // 安全获取关联 Double relatedValue = null; if (lastValuesMap.contains(relatedTag)) { relatedValue = lastValuesMap.get(relatedTag); } if (relatedValue == null) { System.out.println(“同步检测: 关联不可用, tag=” + relatedTag); return; } // 优化比较逻辑:使用更精确的阈 boolean isAnomaly = (currentValue >= 0.99) && (Math.abs(relatedValue) < 0.01); // 调试信息 System.out.printf(“同步检测: %s (%.4f) vs %s (%.4f) -> %b%n”, config.tag, currentValue, relatedTag, relatedValue, isAnomaly); if (isAnomaly) { if (status.startTime == null) { status.startTime = timestamp; } else if (!status.reported) { long elapsed = timestamp.getTime() - status.startTime.getTime(); if (elapsed >= config.duration * 60 * 1000) { reportAnomaly(6, 1, currentValue, timeStr, config, out); status.reported = true; } } } else { if (status.reported) { reportAnomaly(6, 0, currentValue, timeStr, config, out); status.reset(); } else if (status.startTime != null) { status.startTime = null; } } } catch (Exception e) { System.err.println("同步检测错误: " + config.encode + " - " + e.getMessage()); } } // 报告异常 private void reportAnomaly(int anomalyType, int statusFlag, double value, String time, ULEParamConfig config, Collector out) { JSONObject event = new JSONObject(); event.put(“tag”, config.tag); event.put(“paracode”, config.encode); event.put(“abnormaltype”, anomalyType); event.put(“statusflag”, statusFlag); event.put(“datavalue”, value); event.put(“triggertime”, time); out.collect(event); } @Override public void processBroadcastElement(ConfigCollection newConfig, Context ctx, Collector out) { BroadcastState<Void, ConfigCollection> state = ctx.getBroadcastState(Descriptors.configStateDescriptor); try { // 获取旧配置 ConfigCollection oldConfig = state.get(null); // 处理配置变更:清理不再启用的报警 if (oldConfig != null) { for (Map.Entry<String, ULEParamConfig> entry : oldConfig.encodeToConfig.entrySet()) { String encode = entry.getKey(); ULEParamConfig oldCfg = entry.getValue(); // 检查配置是否被删除或禁用 ULEParamConfig newCfg = newConfig.encodeToConfig.get(encode); if (newCfg == null || !isAlarmEnabled(newCfg, oldCfg)) { // 发送恢复事件 sendRecoveryEvents(encode, oldCfg, ctx, out); } } } // 更新广播状态 state.put(null, newConfig); System.out.println("广播配置更新完成, 配置项: " + newConfig.encodeToConfig.size()); System.out.println("配置摘要: " + newConfig.encodeToConfig.keySet()); // 触发离线检测 for (String tag : newConfig.allTags) { ctx.output(OFFLINE_CHECK_TAG, tag); } } catch (Exception e) { e.printStackTrace(); } } // 检查报警是否启用 private boolean isAlarmEnabled(ULEParamConfig newCfg, ULEParamConfig oldCfg) { // 检查所有报警类型是否被禁用 return (oldCfg.constantvalue == 1 && newCfg.constantvalue == 1) || (oldCfg.iszero == 1 && newCfg.iszero == 1) || (oldCfg.ishigh == 1 && newCfg.ishigh == 1) || (oldCfg.islow == 1 && newCfg.islow == 1) || (oldCfg.isonline == 1 && newCfg.isonline == 1) || (oldCfg.issync == 1 && newCfg.issync == 1); } // 发送恢复事件 private void sendRecoveryEvents(String encode, ULEParamConfig config, Context ctx, Collector out) { try { AnomalyState state = stateMap.get(encode); if (state == null) return; // 遍历所有可能的报警类型 for (int type = 1; type <= 6; type++) { AnomalyStatus status = state.getStatus(type); if (status.reported) { JSONObject recoveryEvent = new JSONObject(); recoveryEvent.put(“tag”, config.tag); recoveryEvent.put(“paracode”, config.encode); recoveryEvent.put(“abnormaltype”, type); recoveryEvent.put(“statusflag”, 0); // 恢复事件 recoveryEvent.put(“datavalue”, 0.0); recoveryEvent.put(“triggertime”, timeFormat.format(new Date())); out.collect(recoveryEvent); status.reset(); } } // 更新状态 stateMap.put(encode, state); } catch (Exception e) { System.err.println(“发送恢复事件失败: " + e.getMessage()); } } // ========== 辅助方法 ========== private ConfigCollection getBroadcastConfig(ReadOnlyContext ctx) throws Exception { return ctx.getBroadcastState(Descriptors.configStateDescriptor).get(null); } private AnomalyState getOrCreateState(String encode) throws Exception { AnomalyState state = stateMap.get(encode); if (state == null) { state = new AnomalyState(); } return state; } } // 异常状态类 public static class AnomalyState implements Serializable { private static final long serialVersionUID = 1L; private final Map<Integer, AnomalyStatus> statusMap = new HashMap<>(); public AnomalyStatus getStatus(int type) { return statusMap.computeIfAbsent(type, k -> new AnomalyStatus()); } } // 异常状态详情 public static class AnomalyStatus implements Serializable { private static final long serialVersionUID = 1L; public Date startTime; // 异常开始时间 public Double lastValue; // 用于恒检测 public Date lastChangeTime; // 最后变化时间 public boolean reported; // 是否已报告 public void reset() { startTime = null; lastValue = null; lastChangeTime = null; reported = false; } } } 运行日志为"C:\Program Files (x86)\Java\jdk1.8.0_102\bin\java.exe” -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:12725,suspend=y,server=n -javaagent:C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2021.2\captureAgent\debugger-agent.jar=file:/C:/Users/Administrator/AppData/Local/Temp/capture.props -Dfile.encoding=UTF-8 -classpath C:\Users\Administrator\AppData\Local\Temp\classpath679239090.jar com.tongchuang.realtime.mds.ULEDataanomalyanalysis 已连接到目标 VM, 地址: ‘‘127.0.0.1:12725’,传输: ‘套接字’’ SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/F:/flink/flinkmaven/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.10.0/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/F:/flink/flinkmaven/repository/org/slf4j/slf4j-log4j12/1.7.25/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory] 加载配置: 30 个参数 配置加载完成,检查点时间: Mon Aug 04 10:51:26 CST 2025 广播配置更新完成, 配置项: 30 配置摘要: [EP000015, EP000014, EP000013, EP000012, EP000011, EP000010, EP100013, EP100014, EP000019, EP000018, EP100010, EP000017, EP100011, EP000016, EP100012, EP000004, EP000003, EP000002, EP000001, EP000022, EP000021, EP100007, EP000020, EP100008, EP100009, EP000009, EP000008, EP000007, EP000006, EP000005] 分钟数据流> {“times”:“2025-08-04 10:51”,“datas”:{“DA-LT-5BT0001”:{“ontime”:3093.452,“avg”:3128.6265,“min”:3083.741,“max”:3185.4487},“DA-LT-6BT008”:{“ontime”:174.2086,“avg”:172.546,“min”:171.8335,“max”:174.2086},“DA-LT-5BT0005”:{“ontime”:408.24,“avg”:407.208,“min”:404.94,“max”:409.2},“DA-LT-6BT004”:{“ontime”:1219.4089,“avg”:1219.8833,“min”:1219.3755,“max”:1220.4434},“DA-LT-5BT0004”:{“ontime”:1200.4,“avg”:1200.045,“min”:1199.5,“max”:1200.5},“DA-LT-6BT005”:{“ontime”:389.8511,“avg”:390.6297,“min”:389.8511,“max”:391.9514},“DA-LT-5BT0008”:{“ontime”:193.6,“avg”:190.7653,“min”:186.94,“max”:193.82},“DA-NY-LG1ZL-2-001”:{“ontime”:0.0,“avg”:0.0,“min”:0.0,“max”:0.0},“DA-LT-4BT0008”:{“ontime”:124.2625,“avg”:124.46,“min”:123.1875,“max”:125.7875},“DA-LT-4BT0007”:{“ontime”:169.4,“avg”:169.715,“min”:168.9,“max”:170.3},“DB5701P250A00_101”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0},“DA-LT-4BT0004”:{“ontime”:1211.0,“avg”:1211.0,“min”:1211.0,“max”:1211.0},“DA-LT-6BT001”:{“ontime”:174443.58,“avg”:173604.8032,“min”:172657.02,“max”:174912.67},“DA-LT-4BT0005”:{“ontime”:293.0625,“avg”:293.5583,“min”:292.1875,“max”:294.6875},“DA-NY-LG2ZL-2-003”:{“ontime”:0.0,“avg”:0.0,“min”:0.0,“max”:0.0},“DA_DB195_RH_R_0281”:{“ontime”:283.58,“avg”:310.297,“min”:283.58,“max”:384.99},“DA-DB195-RH-B-0200”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0},“DA-DB195-RH-B-0201”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0},“DA-LT-4BT0001”:{“ontime”:120682.57,“avg”:120638.2251,“min”:119844.39,“max”:121553.055}}} 同步检测 - 当前配置: ULEParamConfig(tag=DA-DB195-RH-B-0201, encode=EP000001, datatype=436887485805570949, constantvalue=1, iszero=1, isonline=1, issync=1, syncparaencode=EP000022, ishigh=1, highthreshold=1000000.0, islow=1, lowthreshold=10.0, duration=1) 同步检测: 关联不可用, tag=DA-NY-LG1ZL-2-001 分钟数据流> {“times”:“2025-08-04 10:52”,“datas”:{“DA-LT-5BT0001”:{“ontime”:3105.4685,“avg”:3127.2034,“min”:3085.331,“max”:3208.071},“DA-LT-6BT008”:{“ontime”:172.8935,“avg”:173.5736,“min”:172.8935,“max”:174.0123},“DA-LT-5BT0005”:{“ontime”:404.88,“avg”:405.671,“min”:404.76,“max”:407.34},“DA-LT-5BT0004”:{“ontime”:1199.4,“avg”:1198.915,“min”:1198.2001,“max”:1199.6},“DA-LT-6BT004”:{“ontime”:1220.4434,“avg”:1220.8577,“min”:1220.3433,“max”:1221.2441},“DA-LT-6BT005”:{“ontime”:391.971,“avg”:392.889,“min”:391.971,“max”:393.3843},“DA-LT-5BT0008”:{“ontime”:186.88,“avg”:188.0343,“min”:186.8,“max”:189.34},“DA-NY-LG1ZL-2-001”:{“ontime”:0.0,“avg”:0.0,“min”:0.0,“max”:0.0},“DA-LT-4BT0008”:{“ontime”:124.6625,“avg”:124.4888,“min”:123.825,“max”:125.3625},“DA-LT-4BT0007”:{“ontime”:170.0,“avg”:170.085,“min”:169.3,“max”:170.4},“DB5701P250A00_101”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0},“DA-LT-4BT0004”:{“ontime”:1211.0,“avg”:1210.3333,“min”:1210.0,“max”:1211.0},“DA-LT-6BT001”:{“ontime”:173081.9,“avg”:173387.4525,“min”:172657.1,“max”:174215.6},“DA-LT-4BT0005”:{“ontime”:294.0625,“avg”:293.925,“min”:292.625,“max”:294.5},“DA-NY-LG2ZL-2-003”:{“ontime”:0.0,“avg”:0.0,“min”:0.0,“max”:0.0},“DA_DB195_RH_R_0281”:{“ontime”:311.85,“avg”:298.3053,“min”:226.51,“max”:340.17},“DA-DB195-RH-B-0200”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0},“DA-DB195-RH-B-0201”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0},“DA-LT-4BT0001”:{“ontime”:120709.81,“avg”:121436.6195,“min”:120241.945,“max”:123212.08}}} 异常检测结果> {“abnormaltype”:2,“paracode”:“EP000022”,“datavalue”:0.0,“tag”:“DA-NY-LG1ZL-2-001”,“triggertime”:“2025-08-04 10:52”,“statusflag”:1} 异常检测结果> {“abnormaltype”:4,“paracode”:“EP000022”,“datavalue”:0.0,“tag”:“DA-NY-LG1ZL-2-001”,“triggertime”:“2025-08-04 10:52”,“statusflag”:1} 异常检测结果> {“abnormaltype”:4,“paracode”:“EP000001”,“datavalue”:1.0,“tag”:“DA-DB195-RH-B-0201”,“triggertime”:“2025-08-04 10:52”,“statusflag”:1} 同步检测 - 当前配置: ULEParamConfig(tag=DA-DB195-RH-B-0201, encode=EP000001, datatype=436887485805570949, constantvalue=1, iszero=1, isonline=1, issync=1, syncparaencode=EP000022, ishigh=1, highthreshold=1000000.0, islow=1, lowthreshold=10.0, duration=1) 同步检测: 关联不可用, tag=DA-NY-LG1ZL-2-001 分钟数据流> {“times”:“2025-08-04 10:53”,“datas”:{“DA-LT-5BT0001”:{“ontime”:3088.489,“avg”:3114.5305,“min”:3066.6252,“max”:3183.479},“DA-LT-6BT008”:{“ontime”:173.9338,“avg”:174.8619,“min”:173.9141,“max”:176.7015},“DA-LT-5BT0005”:{“ontime”:407.34,“avg”:408.787,“min”:407.34,“max”:409.62},“DA-LT-5BT0004”:{“ontime”:1198.2001,“avg”:1197.635,“min”:1197.0,“max”:1198.3},“DA-LT-6BT004”:{“ontime”:1221.1775,“avg”:1221.4828,“min”:1221.144,“max”:1221.7448},“DA-LT-6BT005”:{“ontime”:393.345,“avg”:393.5502,“min”:393.031,“max”:394.1498},“DA-LT-5BT0008”:{“ontime”:189.26,“avg”:190.819,“min”:189.26,“max”:192.74},“DA-NY-LG1ZL-2-001”:{“ontime”:0.0,“avg”:0.0,“min”:0.0,“max”:0.0},“DA-LT-4BT0008”:{“ontime”:124.2125,“avg”:124.3077,“min”:123.5125,“max”:125.1125},“DA-LT-4BT0007”:{“ontime”:169.4,“avg”:169.0767,“min”:167.7,“max”:169.8},“DB5701P250A00_101”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0},“DA-LT-4BT0004”:{“ontime”:1210.0,“avg”:1209.3167,“min”:1209.0,“max”:1210.0},“DA-LT-6BT001”:{“ontime”:173364.6,“avg”:173578.1482,“min”:172720.47,“max”:174390.27},“DA-LT-4BT0005”:{“ontime”:292.8125,“avg”:292.6771,“min”:291.1875,“max”:293.6875},“DA-NY-LG2ZL-2-003”:{“ontime”:0.0,“avg”:0.0,“min”:0.0,“max”:0.0},“DA_DB195_RH_R_0281”:{“ontime”:295.82,“avg”:294.4385,“min”:273.98,“max”:322.66},“DA-DB195-RH-B-0200”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0},“DA-DB195-RH-B-0201”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0},“DA-LT-4BT0001”:{“ontime”:122562.12,“avg”:122467.8892,“min”:120901.414,“max”:124176.8}}} 异常检测结果> {“abnormaltype”:1,“paracode”:“EP000022”,“datavalue”:0.0,“tag”:“DA-NY-LG1ZL-2-001”,“triggertime”:“2025-08-04 10:53”,“statusflag”:1} 异常检测结果> {“abnormaltype”:1,“paracode”:“EP000001”,“datavalue”:1.0,“tag”:“DA-DB195-RH-B-0201”,“triggertime”:“2025-08-04 10:53”,“statusflag”:1} 同步检测: 关联不可用, tag=DA-NY-LG1ZL-2-001 分钟数据流> {“times”:“2025-08-04 10:54”,“datas”:{“DA-LT-5BT0001”:{“ontime”:3078.615,“avg”:3082.1354,“min”:3039.7373,“max”:3216.3108},“DA-LT-6BT008”:{“ontime”:175.5434,“avg”:173.7907,“min”:172.8149,“max”:175.5434},“DA-LT-5BT0005”:{“ontime”:409.38,“avg”:408.7688,“min”:407.94,“max”:409.68},“DA-LT-5BT0004”:{“ontime”:1196.9,“avg”:1196.2543,“min”:1195.3,“max”:1197.1},“DA-LT-6BT004”:{“ontime”:1221.7448,“avg”:1221.7742,“min”:1221.6447,“max”:1221.8448},“DA-LT-6BT005”:{“ontime”:393.1291,“avg”:392.4774,“min”:392.1673,“max”:393.1291},“DA-LT-5BT0008”:{“ontime”:191.14,“avg”:191.1912,“min”:190.66,“max”:191.74},“DA-NY-LG1ZL-2-001”:{“ontime”:0.0,“avg”:0.0,“min”:0.0,“max”:0.0},“DA-LT-4BT0008”:{“ontime”:123.825,“avg”:123.6761,“min”:122.225,“max”:124.7875},“DA-LT-4BT0007”:{“ontime”:167.5,“avg”:167.35,“min”:167.1,“max”:167.5},“DB5701P250A00_101”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0},“DA-LT-4BT0004”:{“ontime”:1209.0,“avg”:1209.0,“min”:1209.0,“max”:1209.0},“DA-LT-6BT001”:{“ontime”:173662.19,“avg”:173854.9536,“min”:172842.14,“max”:175016.47},“DA-LT-4BT0005”:{“ontime”:290.625,“avg”:291.1727,“min”:290.25,“max”:291.9375},“DA-NY-LG2ZL-2-003”:{“ontime”:0.0,“avg”:0.0,“min”:0.0,“max”:0.0},“DA_DB195_RH_R_0281”:{“ontime”:316.75,“avg”:294.1453,“min”:263.4,“max”:318.26},“DA-DB195-RH-B-0200”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0},“DA-LT-4BT0001”:{“ontime”:123655.62,“avg”:122644.2382,“min”:121316.24,“max”:123656.664},“DA-DB195-RH-B-0201”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0}}} 同步检测 - 当前配置: ULEParamConfig(tag=DA-DB195-RH-B-0201, encode=EP000001, datatype=436887485805570949, constantvalue=1, iszero=1, isonline=1, issync=1, syncparaencode=EP000022, ishigh=1, highthreshold=1000000.0, islow=1, lowthreshold=10.0, duration=1) 同步检测: 关联不可用, tag=DA-NY-LG1ZL-2-001 分钟数据流> {“times”:“2025-08-04 10:55”,“datas”:{“DA-LT-5BT0001”:{“ontime”:3218.5786,“avg”:3046.705,“min”:2944.5356,“max”:3218.5786},“DA-LT-6BT008”:{“ontime”:174.4442,“avg”:173.5075,“min”:171.5587,“max”:174.719},“DA-LT-5BT0005”:{“ontime”:407.76,“avg”:410.281,“min”:406.38,“max”:412.92},“DA-LT-5BT0004”:{“ontime”:1195.5,“avg”:1194.82,“min”:1194.4,“max”:1195.5},“DA-LT-6BT004”:{“ontime”:1221.8115,“avg”:1221.7748,“min”:1221.678,“max”:1221.8448},“DA-LT-6BT005”:{“ontime”:392.2654,“avg”:391.9164,“min”:391.4803,“max”:392.344},“DA-LT-5BT0008”:{“ontime”:191.16,“avg”:193.6457,“min”:190.1,“max”:195.76},“DA-NY-LG1ZL-2-001”:{“ontime”:0.0,“avg”:0.0,“min”:0.0,“max”:0.0},“DA-LT-4BT0008”:{“ontime”:122.225,“avg”:123.2477,“min”:121.95,“max”:125.275},“DB5701P250A00_101”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0},“DA-LT-4BT0004”:{“ontime”:1209.0,“avg”:1209.1833,“min”:1209.0,“max”:1210.0},“DA-LT-6BT001”:{“ontime”:173967.0,“avg”:173799.209,“min”:172448.05,“max”:174773.38},“DA-LT-4BT0005”:{“ontime”:290.625,“avg”:292.1531,“min”:290.625,“max”:294.1875},“DA-NY-LG2ZL-2-003”:{“ontime”:0.0,“avg”:0.0,“min”:0.0,“max”:0.0},“DA_DB195_RH_R_0281”:{“ontime”:295.73,“avg”:299.1413,“min”:258.3,“max”:335.65},“DA-DB195-RH-B-0200”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0},“DA-LT-4BT0001”:{“ontime”:123094.66,“avg”:121517.155,“min”:120457.766,“max”:123094.66},“DA-DB195-RH-B-0201”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0}}} 同步检测: 关联不可用, tag=DA-NY-LG1ZL-2-001 加载配置: 30 个参数 配置加载完成,检查点时间: Mon Aug 04 10:56:27 CST 2025 广播配置更新完成, 配置项: 30 配置摘要: [EP000015, EP000014, EP000013, EP000012, EP000011, EP000010, EP100013, EP100014, EP000019, EP000018, EP100010, EP000017, EP100011, EP000016, EP100012, EP000004, EP000003, EP000002, EP000001, EP000022, EP000021, EP100007, EP000020, EP100008, EP100009, EP000009, EP000008, EP000007, EP000006, EP000005] 分钟数据流> {“times”:“2025-08-04 10:56”,“datas”:{“DA-LT-5BT0001”:{“ontime”:3057.6804,“avg”:3012.5768,“min”:2949.3123,“max”:3078.372},“DA-LT-6BT008”:{“ontime”:171.8335,“avg”:172.1848,“min”:171.8335,“max”:172.5597},“DA-LT-5BT0005”:{“ontime”:412.74,“avg”:413.215,“min”:412.02,“max”:415.14},“DA-LT-6BT004”:{“ontime”:1221.678,“avg”:1221.6897,“min”:1221.6113,“max”:1221.7448},“DA-LT-5BT0004”:{“ontime”:1194.8,“avg”:1196.8434,“min”:1194.8,“max”:1199.3},“DA-LT-6BT005”:{“ontime”:391.5392,“avg”:390.6559,“min”:389.8314,“max”:391.5392},“DA-LT-5BT0008”:{“ontime”:195.66,“avg”:195.8223,“min”:195.08,“max”:197.42},“DA-NY-LG1ZL-2-001”:{“ontime”:0.0,“avg”:0.0,“min”:0.0,“max”:0.0},“DA-LT-4BT0008”:{“ontime”:125.275,“avg”:124.2504,“min”:123.45,“max”:126.2625},“DB5701P250A00_101”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0},“DA-LT-4BT0004”:{“ontime”:1210.0,“avg”:1210.0,“min”:1210.0,“max”:1210.0},“DA-LT-6BT001”:{“ontime”:173206.77,“avg”:174326.7505,“min”:173206.77,“max”:175154.61},“DA-LT-4BT0005”:{“ontime”:293.875,“avg”:293.4646,“min”:292.5625,“max”:295.0625},“DA-NY-LG2ZL-2-003”:{“ontime”:0.0,“avg”:0.0,“min”:0.0,“max”:0.0},“DA_DB195_RH_R_0281”:{“ontime”:288.86,“avg”:301.8983,“min”:268.97,“max”:349.89},“DA-DB195-RH-B-0200”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0},“DA-LT-4BT0001”:{“ontime”:120710.516,“avg”:120748.8062,“min”:119682.57,“max”:122023.83},“DA-DB195-RH-B-0201”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0}}} 同步检测 - 当前配置: ULEParamConfig(tag=DA-DB195-RH-B-0201, encode=EP000001, datatype=436887485805570949, constantvalue=1, iszero=1, isonline=1, issync=1, syncparaencode=EP000022, ishigh=1, highthreshold=1000000.0, islow=1, lowthreshold=10.0, duration=1) 同步检测: 关联不可用, tag=DA-NY-LG1ZL-2-001 分钟数据流> {“times”:“2025-08-04 10:57”,“datas”:{“DA-LT-5BT0001”:{“ontime”:3005.6284,“avg”:3004.7748,“min”:2962.2488,“max”:3059.464},“DA-LT-6BT008”:{“ontime”:171.9316,“avg”:171.3516,“min”:170.5968,“max”:172.0494},“DA-LT-5BT0005”:{“ontime”:415.14,“avg”:416.542,“min”:415.14,“max”:417.24},“DA-LT-5BT0004”:{“ontime”:1199.3,“avg”:1200.7184,“min”:1199.3,“max”:1201.3},“DA-LT-6BT004”:{“ontime”:1221.7114,“avg”:1221.5724,“min”:1221.411,“max”:1221.7448},“DA-LT-6BT005”:{“ontime”:389.8118,“avg”:389.4774,“min”:389.1444,“max”:389.8118},“DA-LT-5BT0008”:{“ontime”:197.42,“avg”:198.3487,“min”:197.42,“max”:198.68},“DA-NY-LG1ZL-2-001”:{“ontime”:0.0,“avg”:0.0,“min”:0.0,“max”:0.0},“DA-LT-4BT0008”:{“ontime”:124.2,“avg”:123.2256,“min”:121.8625,“max”:126.1},“DB5701P250A00_101”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0},“DA-LT-4BT0004”:{“ontime”:1210.0,“avg”:1210.0,“min”:1210.0,“max”:1210.0},“DA-LT-6BT001”:{“ontime”:174333.06,“avg”:173710.917,“min”:172544.47,“max”:174776.31},“DA-NY-LG2ZL-2-003”:{“ontime”:0.0,“avg”:0.0,“min”:0.0,“max”:0.0},“DA-LT-4BT0005”:{“ontime”:294.0,“avg”:293.3229,“min”:291.5625,“max”:296.0},“DA_DB195_RH_R_0281”:{“ontime”:289.38,“avg”:297.7735,“min”:273.12,“max”:343.61},“DA-DB195-RH-B-0200”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0},“DA-LT-4BT0001”:{“ontime”:121024.04,“avg”:120971.4221,“min”:120043.63,“max”:122208.27},“DA-DB195-RH-B-0201”:{“ontime”:1.0,“avg”:1.0,“min”:1.0,“max”:1.0}}} 同步检测 - 当前配置: ULEParamConfig(tag=DA-DB195-RH-B-0201, encode=EP000001, datatype=436887485805570949, constantvalue=1, iszero=1, isonline=1, issync=1, syncparaencode=EP000022, ishigh=1, highthreshold=1000000.0, islow=1, lowthreshold=10.0, duration=1) 同步检测: 关联不可用, tag=DA-NY-LG1ZL-2-001。其中1、同步分析功能为实现。2、DA-LT-4BT0007的初始离线和流数据出现数据又离线均未报出离线异常。请生成完整优化后代码
08-05
package org.找车位; import com.sun.xml.internal.ws.util.QNameMap; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Scanner; public class test { /* 有 n 辆汽车去停车场找车位,这些汽车从0开始依次编号。 停车场里有无数个车位,也从0开始依次编号。当一辆汽车到达停车场时,会停在编号最小且空闲的车位。 比方说,当一辆汽车到达时,如果车位 0 ,1 和 5 被占据了,那么它会停在 2 号车位。 当一辆汽车离开停车场时,这个车位会立刻释放变成空闲状态;如果同一时刻有另一辆汽车到达,且该车位满足”编号最小且空闲”条件,则新来车辆可以立即停在这个车位。 给你汽车数量n和它们到达和离开的时刻,所有汽车到达时刻互不相同。 请你返回目标编号汽车所停的车位编号。 输入 输入有两行 第一行表示汽车数量n和目标汽车编号 第二行表示所有汽车到达和离开的时刻,共有2n个,比如如下输入表示有三辆汽车,编号为0的汽车到达时刻为1,离开时刻为4;编号为1的汽车到达时刻为2,离开时刻为3;编号为2的汽车到达时刻为4,离开时刻为6 3 1 1 4 2 3 4 6 输出 目标编号汽车所停的车位编号 */ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 输入汽车的数量 int n = scanner.nextInt(); //目标汽车编号 int y = scanner.nextInt(); //汽车所在车位 HashMap<Integer, HashMap<Integer, Integer>> Car_position = new HashMap<>(); HashMap<Integer, Integer> parkState = new HashMap<>(); // 定义一个长度为10000的数组,表示10000个车位 int[] park = new int[n]; // 输入n行,每行两个数,分别表示汽车的到达和离开时刻 for (int i = 0; i < n; i++) { //i为汽车编号 int in = scanner.nextInt(); int out = scanner.nextInt(); // InAndOut.put(i,new HashMap<>(in,out)); for (int j=0;j<park.length;j++){ //j为车位编号 if (park[j]==0){ if (Car_position.get(j)==null) { Car_position.put(j,new HashMap<>(i,out)); parkState.put(i,j); park[j]=1; i++; break; } // PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(); }else if (Car_position.get(j).get(CarByPark(parkState,j))>out){ Car_position.put(j,new HashMap<>(i,out)); parkState.put(i,j); i++; break; } } } System.out.println("目标汽车车位号为"+ y + "停车场编号为"+parkState.get(y)); } static Integer CarByPark(HashMap<Integer, Integer> map, int y){ // 存储匹配的键 Integer p = null; for (Map.Entry<Integer, Integer> entry : map.entrySet()) { if (entry.getValue().equals(y)) { p=entry.getKey(); } } return p; } } 报错C:\dev\jdk1.8.0_332\bin\java.exe -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:56884,suspend=y,server=n -javaagent:C:\Users\yWX1446235\AppData\Local\JetBrains\IntelliJIdea2024.3\captureAgent\debugger-agent.jar -Dkotlinx.coroutines.debug.enable.creation.stack.trace=false -Ddebugger.agent.enable.coroutines=true -Dkotlinx.coroutines.debug.enable.flows.stack.trace=true -Dkotlinx.coroutines.debug.enable.mutable.state.flows.stack.trace=true -Dfile.encoding=UTF-8 -classpath "C:\dev\jdk1.8.0_332\jre\lib\charsets.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\access-bridge-64.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\cldrdata.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\dnsns.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\jaccess.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\jfxrt.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\localedata.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\nashorn.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\sunec.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\sunjce_provider.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\sunmscapi.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\sunpkcs11.jar;C:\dev\jdk1.8.0_332\jre\lib\ext\zipfs.jar;C:\dev\jdk1.8.0_332\jre\lib\jce.jar;C:\dev\jdk1.8.0_332\jre\lib\jfr.jar;C:\dev\jdk1.8.0_332\jre\lib\jfxswt.jar;C:\dev\jdk1.8.0_332\jre\lib\jsse.jar;C:\dev\jdk1.8.0_332\jre\lib\management-agent.jar;C:\dev\jdk1.8.0_332\jre\lib\resources.jar;C:\dev\jdk1.8.0_332\jre\lib\rt.jar;D:\dev\oj\test\Oj\target\classes;C:\dev\IntelliJ IDEA 2024.3.2.2\lib\idea_rt.jar" org.找车位.test Connected to the target VM, address: '127.0.0.1:56884', transport: 'socket' 3 1 1 4 2 3 4 6Exception in thread "main" java.lang.NullPointerException at org.找车位.test.main(test.java:58) ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2 JDWP exit error AGENT_ERROR_NO_JNI_ENV(183): [util.c:840] Disconnected from the target VM, address: '127.0.0.1:56884', transport: 'socket' Process finished with exit code 1
最新发布
11-01
停止云台控制 接口功能 设备停止云台控制 请求地址 https://open.ys7.com/api/lapp/device/ptz/stop 请求方式 POST 子账户token请求所需最小权限 "Permission":"Ptz" "Resource":"Cam:序列号:通道号" 请求参数 参数名 类型 描述 是否必选 accessToken String 授权过程获取的access_token Y deviceSerial String 设备序列号,存在英文字母的设备序列号,字母需为大写 Y channelNo int 通道号 Y direction int 操作命令:0-上,1-下,2-左,3-右,4-左上,5-左下,6-右上,7-右下,8-放大,9-缩小,10-近焦距,11-远焦距,16-自动控制 N 提示:建议停止云台接口带方向参数。 HTTP请求报文 POST /api/lapp/device/ptz/stop HTTP/1.1 Host: open.ys7.com Content-Type: application/x-www-form-urlencoded accessToken=at.25ne3gkr6fa7coh34ys0fl1h9hryc2kr&deviceSerial=568261888&channelNo=1&direction=1 返回数据 { "code": "200", "msg": "操作成功!" } 返回码 返回码 返回消息 描述 200 操作成功 请求成功 10001 参数错误 参数为空或格式不正确 10002 accessToken异常或过期 重新获取accessToken 10005 appKey异常 appKey被冻结 20002 设备不存在 20006 网络异常 检查设备网络状况,稍后再试 20007 设备不在线 检查设备是否在线 20008 设备响应超时 操作过于频繁,稍后再试 20014 deviceSerial不合法 20032 该用户下通道不存在 该用户下通道不存在 49999 数据异常 接口调用异常 60000 设备不支持云台控制 60001 用户无云台控制权限 60006 云台当前操作失败 稍候再试 60009 正在调用预置点 60020 不支持该命令 确认设备是否支持该操作 开始云台控制 接口功能 对设备进行开始云台控制,开始云台控制之后必须先调用停止云台控制接口才能进行其他操作,包括其他方向的云台转动 请求地址 https://open.ys7.com/api/lapp/device/ptz/start 请求方式 POST 子账户token请求所需最小权限 "Permission":"Ptz" "Resource":"Cam:序列号:通道号" 请求参数 参数名 类型 描述 是否必选 accessToken String 授权过程获取的access_token Y deviceSerial String 设备序列号,存在英文字母的设备序列号,字母需为大写 Y channelNo int 通道号 Y direction int 操作命令:0-上,1-下,2-左,3-右,4-左上,5-左下,6-右上,7-右下,8-物理放大,9-物理缩小,10-调整近焦距,11-调整远焦距,16-自动控制 Y speed int 云台速度:0-慢,1-适中,2-快,海康设备参数不可为0 Y HTTP请求报文 POST /api/lapp/device/ptz/start HTTP/1.1 Host: open.ys7.com Content-Type: application/x-www-form-urlencoded accessToken=at.4g01l53x0w22xbp30ov33q44app1ns9m&deviceSerial=502608888&channelNo=1&direction=2&speed=1 返回数据 { "code": "200", "msg": "操作成功!" } 返回码 返回码 返回消息 描述 200 操作成功 请求成功 10001 参数错误 参数为空或格式不正确 10002 accessToken异常或过期 重新获取accessToken 10005 appKey异常 appKey被冻结 20002 设备不存在 20006 网络异常 检查设备网络状况,稍后再试 20007 设备不在线 检查设备是否在线 20008 设备响应超时 操作过于频繁,稍后再试 20014 deviceSerial不合法 20032 该用户下通道不存在 该用户下通道不存在 49999 数据异常 接口调用异常 60000 设备不支持云台控制 60001 用户无云台控制权限 60002 设备云台旋转达到上限位 60003 设备云台旋转达到下限位 60004 设备云台旋转达到左限位 60005 设备云台旋转达到右限位 60006 云台当前操作失败 稍候再试 60009 正在调用预置点 60020 不支持该命令 确认设备是否支持该操作 MainActivity:package com.hik.netsdk.SimpleDemo.View; import android.app.AlertDialog; import android.content.Intent; import android.graphics.PixelFormat; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.Toast; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.hls.HlsMediaSource; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DefaultHttpDataSource; import com.google.gson.Gson; import com.hik.netsdk.SimpleDemo.R; import com.hik.netsdk.SimpleDemo.View.DevMgtUI.AddDevActivity; import com.videogo.errorlayer.ErrorInfo; import com.videogo.openapi.EZConstants; import com.videogo.openapi.EZOpenSDK; import com.videogo.openapi.EZPlayer; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import java.util.concurrent.TimeUnit; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback { // 核心参数 private String mDeviceSerial; private String mVerifyCode; private int mCameraNo = 1; private boolean isEzDevice = false; // 萤石云相关参数 private String mAppKey = "a794d58c13154caeb7d2fbb5c3420c65"; private String mAccessToken = ""; // UI组件 private SurfaceView mPreviewSurface; private SurfaceHolder mSurfaceHolder; private Toolbar m_toolbar; private ProgressBar mProgressBar; private RelativeLayout mControlLayout; private ImageButton mRotateButton; // 播放器相关 private SimpleExoPlayer mExoPlayer; private String mPlaybackUrl; private final OkHttpClient mHttpClient = new OkHttpClient.Builder() .connectTimeout(15, TimeUnit.SECONDS) .readTimeout(15, TimeUnit.SECONDS) .build(); // 播放器状态监听器 private final Player.Listener mPlayerListener = new Player.Listener() { @Override public void onPlaybackStateChanged(int state) { switch (state) { case Player.STATE_READY: mProgressBar.setVisibility(View.GONE); Log.d("ExoPlayer", "播放准备就绪"); break; case Player.STATE_BUFFERING: mProgressBar.setVisibility(View.VISIBLE); Log.d("ExoPlayer", "缓冲中..."); break; case Player.STATE_ENDED: Log.d("ExoPlayer", "播放结束"); break; case Player.STATE_IDLE: Log.d("ExoPlayer", "空闲状态"); break; } } @Override public void onPlayerError(com.google.android.exoplayer2.PlaybackException error) { Log.e("ExoPlayer", "播放错误: " + error.getMessage()); handleError("播放错误: " + error.getMessage(), -1); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化UI组件 initUIComponents(); // 获取启动参数 parseIntentParams(); // 初始化SDK initSDK(); // 参数校验 if (mDeviceSerial == null || mDeviceSerial.isEmpty()) { showErrorAndFinish("设备序列号不能为空"); return; } Log.d("MainActivity", "onCreate完成: isEzDevice=" + isEzDevice); } private void initUIComponents() { // 基础UI m_toolbar = findViewById(R.id.toolbar); setSupportActionBar(m_toolbar); // 预览相关UI mPreviewSurface = findViewById(R.id.realplay_sv); mSurfaceHolder = mPreviewSurface.getHolder(); mSurfaceHolder.addCallback(this); mSurfaceHolder.setFormat(PixelFormat.TRANSLUCENT); mProgressBar = findViewById(R.id.liveProgressBar); mControlLayout = findViewById(R.id.rl_control); mRotateButton = findViewById(R.id.ib_rotate2); // 设置旋转按钮点击事件 mRotateButton.setOnClickListener(v -> changeScreen()); // 隐藏管理UI DrawerLayout drawer = findViewById(R.id.drawer_layout); if (drawer != null) { drawer.setVisibility(View.GONE); } if (m_toolbar != null) { m_toolbar.setVisibility(View.GONE); } // 初始化控制按钮 initControlButtons(); Log.d("UI", "UI组件初始化完成"); } private void parseIntentParams() { // 获取Intent参数 Intent intent = getIntent(); isEzDevice = true; // 只支持萤石设备 mAccessToken = intent.getStringExtra("accessToken"); // 优先使用bundle Bundle bundle = intent.getExtras(); if (bundle != null) { mDeviceSerial = bundle.getString("devSn"); mVerifyCode = bundle.getString("verifyCode"); mCameraNo = bundle.getInt("cameraNo", 1); } // 兼容直接Extra方式 if (mDeviceSerial == null) mDeviceSerial = intent.getStringExtra("devSn"); if (mVerifyCode == null) mVerifyCode = intent.getStringExtra("verifyCode"); if (mCameraNo == 0) mCameraNo = intent.getIntExtra("cameraNo", 1); Log.d("Params", "设备序列号: " + mDeviceSerial + ", 通道号: " + mCameraNo); } private void initSDK() { try { // 使用反射检查初始化状态 boolean isInitialized = false; try { // 尝试获取实例 EZOpenSDK instance = EZOpenSDK.getInstance(); if (instance != null) { isInitialized = true; } } catch (Exception e) { // 捕获未初始化的异常 isInitialized = false; } // 未初始化时进行初始化 if (!isInitialized) { EZOpenSDK.initLib(getApplication(), mAppKey); Log.d("EZSDK", "萤石SDK初始化完成"); } // 设置AccessToken if (mAccessToken != null && !mAccessToken.isEmpty()) { EZOpenSDK.getInstance().setAccessToken(mAccessToken); Log.d("EZToken", "AccessToken设置成功"); } else { Log.w("EZToken", "AccessToken缺失!"); } } catch (Exception e) { Log.e("EZSDK", "萤石SDK初始化失败", e); handleError("萤石SDK初始化失败: " + e.getMessage(), -1); } } private void initControlButtons() { // 云台控制按钮 findViewById(R.id.ptz_top_btn).setOnClickListener(v -> controlPTZ("UP")); findViewById(R.id.ptz_bottom_btn).setOnClickListener(v -> controlPTZ("DOWN")); findViewById(R.id.ptz_left_btn).setOnClickListener(v -> controlPTZ("LEFT")); findViewById(R.id.ptz_right_btn).setOnClickListener(v -> controlPTZ("RIGHT")); // 变焦控制 findViewById(R.id.focus_add).setOnClickListener(v -> controlZoom("ZOOM_IN")); findViewById(R.id.foucus_reduce).setOnClickListener(v -> controlZoom("ZOOM_OUT")); // 水平布局控制按钮 findViewById(R.id.ptz_top_btn2).setOnClickListener(v -> controlPTZ("UP")); findViewById(R.id.ptz_bottom_btn2).setOnClickListener(v -> controlPTZ("DOWN")); findViewById(R.id.ptz_left_btn2).setOnClickListener(v -> controlPTZ("LEFT")); findViewById(R.id.ptz_right_btn2).setOnClickListener(v -> controlPTZ("RIGHT")); // 添加萤石云特有功能按钮 findViewById(R.id.btn_record).setOnClickListener(v -> startLocalRecord()); findViewById(R.id.btn_stop_record).setOnClickListener(v -> stopLocalRecord()); findViewById(R.id.btn_capture).setOnClickListener(v -> capturePicture()); Log.d("Controls", "控制按钮初始化完成"); } @Override public void surfaceCreated(SurfaceHolder holder) { Log.d("Surface", "Surface created"); // 获取播放地址并开始播放 new Thread(this::fetchPlaybackUrl).start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.d("Surface", "Surface changed: " + width + "x" + height); if (mExoPlayer != null) { mExoPlayer.setVideoSurfaceHolder(holder); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.d("Surface", "Surface destroyed"); stopPreview(); } // ======================== 播放地址获取与播放 ======================== private void fetchPlaybackUrl() { try { // 构建请求参数 JSONObject params = new JSONObject(); params.put("accessToken", mAccessToken); params.put("deviceSerial", mDeviceSerial); params.put("channelNo", mCameraNo); params.put("protocol", 2); // 使用HLS协议 if (mVerifyCode != null && !mVerifyCode.isEmpty()) { params.put("code", mVerifyCode); } params.put("expireTime", 7200); // 2小时有效期 // 创建请求体 RequestBody body = RequestBody.create( MediaType.parse("application/json"), params.toString() ); // 创建请求 Request request = new Request.Builder() .url("https://open.ys7.com/api/lapp/v2/live/address/get") .post(body) .build(); // 执行请求 try (Response response = mHttpClient.newCall(request).execute()) { if (!response.isSuccessful()) { handleError("获取播放地址失败: " + response.code(), response.code()); return; } // 解析响应 String responseBody = response.body().string(); JSONObject json = new JSONObject(responseBody); if ("200".equals(json.getString("code"))) { JSONObject data = json.getJSONObject("data"); mPlaybackUrl = data.getString("url"); Log.d("PlaybackURL", "获取到播放地址: " + mPlaybackUrl); // 在主线程初始化播放器 runOnUiThread(this::initExoPlayer); } else { handleError("API错误: " + json.getString("msg"), json.getInt("code")); } } } catch (JSONException | IOException e) { Log.e("FetchURL", "获取播放地址异常", e); handleError("获取播放地址异常: " + e.getMessage(), -1); } } private void initExoPlayer() { // 释放现有播放器 if (mExoPlayer != null) { mExoPlayer.release(); } // 创建新的播放器实例 mExoPlayer = new SimpleExoPlayer.Builder(this).build(); mExoPlayer.addListener(mPlayerListener); mExoPlayer.setVideoSurfaceHolder(mSurfaceHolder); // 创建媒体源 DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory(); MediaSource mediaSource = new HlsMediaSource.Factory(dataSourceFactory) .createMediaSource(MediaItem.fromUri(Uri.parse(mPlaybackUrl))); // 准备播放 mExoPlayer.setMediaSource(mediaSource); mExoPlayer.prepare(); mExoPlayer.setPlayWhenReady(true); mProgressBar.setVisibility(View.VISIBLE); Log.d("ExoPlayer", "播放器初始化完成,开始播放"); } // ======================== 萤石云控制方法 ======================== private void controlPTZ(String direction) { try { EZConstants.EZPTZAction action; switch (direction) { case "UP": action = EZConstants.EZPTZAction.EZPTZActionUp; break; case "DOWN": action = EZConstants.EZPTZAction.EZPTZActionDown; break; case "LEFT": action = EZConstants.EZPTZAction.EZPTZActionLeft; break; case "RIGHT": action = EZConstants.EZPTZAction.EZPTZActionRight; break; default: return; } // 使用EZOpenSDK的API进行控制 EZOpenSDK.getInstance().controlPTZ( mDeviceSerial, mCameraNo, action, EZConstants.EZPTZCommand.EZPTZCommandStart, 2 ); // 300ms后停止控制 new Handler().postDelayed(() -> { EZOpenSDK.getInstance().controlPTZ( mDeviceSerial, mCameraNo, EZConstants.EZPTZAction.EZPTZActionStop, EZConstants.EZPTZCommand.EZPTZCommandStop, 0 ); }, 300); } catch (Exception e) { Log.e("EZPTZ", "云台控制异常", e); } } private void controlZoom(String command) { try { EZConstants.EZPTZAction action = "ZOOM_IN".equals(command) ? EZConstants.EZPTZAction.EZPTZActionZoomIn : EZConstants.EZPTZAction.EZPTZActionZoomOut; // 使用EZOpenSDK的API进行控制 EZOpenSDK.getInstance().controlPTZ( mDeviceSerial, mCameraNo, action, EZConstants.EZPTZCommand.EZPTZCommandStart, 2 ); // 300ms后停止控制 new Handler().postDelayed(() -> { EZOpenSDK.getInstance().controlPTZ( mDeviceSerial, mCameraNo, EZConstants.EZPTZAction.EZPTZActionStop, EZConstants.EZPTZCommand.EZPTZCommandStop, 0 ); }, 300); } catch (Exception e) { Log.e("EZZoom", "变焦控制异常", e); } } // ======================== 萤石云扩展功能 ======================== // 开始本地录像 private void startLocalRecord() { // 这里需要根据实际需求实现 Toast.makeText(this, "开始录像", Toast.LENGTH_SHORT).show(); } // 停止本地录像 private void stopLocalRecord() { // 这里需要根据实际需求实现 Toast.makeText(this, "停止录像", Toast.LENGTH_SHORT).show(); } // 截图 private void capturePicture() { // 这里需要根据实际需求实现 Toast.makeText(this, "截图已保存", Toast.LENGTH_SHORT).show(); } // ======================== 通用功能方法 ======================== public void changeScreen(View view) { changeScreen(); } private void changeScreen() { if (mControlLayout.getVisibility() == View.VISIBLE) { mControlLayout.setVisibility(View.GONE); } else { mControlLayout.setVisibility(View.VISIBLE); } } private void handleError(String message, int errorCode) { String fullMessage = message + " (错误码: " + errorCode + ")"; // 萤石云特有错误码处理 switch (errorCode) { case 400001: fullMessage = "AccessToken无效"; break; case 400002: fullMessage = "设备不存在"; break; case 400007: fullMessage = "设备不在线"; break; case 400034: fullMessage = "验证码错误"; break; case 400035: fullMessage = "设备已被自己添加"; break; case 400036: fullMessage = "设备已被别人添加"; break; default: fullMessage = "萤石云错误: " + errorCode; } new AlertDialog.Builder(this) .setTitle("预览失败") .setMessage(fullMessage) .setPositiveButton("确定", (d, w) -> finish()) .setCancelable(false) .show(); } private void showErrorAndFinish(String message) { Toast.makeText(this, message, Toast.LENGTH_LONG).show(); new Handler().postDelayed(this::finish, 3000); } private void stopPreview() { if (mExoPlayer != null) { mExoPlayer.release(); mExoPlayer = null; Log.d("Preview", "预览已停止"); } } @Override protected void onDestroy() { super.onDestroy(); stopPreview(); Log.d("Lifecycle", "onDestroy"); } @Override protected void onPause() { super.onPause(); if (mExoPlayer != null) { mExoPlayer.setPlayWhenReady(false); Log.d("Lifecycle", "暂停播放"); } } @Override protected void onResume() { super.onResume(); if (mExoPlayer != null) { mExoPlayer.setPlayWhenReady(true); Log.d("Lifecycle", "恢复播放"); } } @Override public void onBackPressed() { DrawerLayout drawer = findViewById(R.id.drawer_layout); if (drawer != null && drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { super.onBackPressed(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main_opt, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.action_1) { startActivity(new Intent(this, AddDevActivity.class)); return true; } return super.onOptionsItemSelected(item); } } 依据上述开发文档中停止云台控制和开始云台控制更新MainActivity代码实现完全符合开发文档的功能。
06-22
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Unknown To Known

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值