Algorithms—151.Reverse Words in a String

本文详细介绍了如何通过反向读取字符串、非空暂存、空拼接等方法优化字符串处理过程,并特别关注了如何在中间处理空格以避免不必要的重复和错误。此外,文章还提供了实现代码,帮助开发者理解和实践这些优化技巧。

思路:思路很简单,反着读,非空格暂存,读到空格拼接。难点在于前后空格省略,中间空格合并为一个。只是优化的难点,不是实现的难点。

耗时:440ms。处于下游水准,代码较渣。

public class Solution {
    public String reverseWords(String s) {
		if (s.length()<1) {
			return s;
		}
		String a = "";
		String answer = "";
		boolean flag=true;
		for (int i = s.length() - 1; i >= 0; i--) {
			String k = s.substring(i, i + 1);
			if (flag) {
				if (k.equals(" ")) {
					
				}else {
					flag=false;
					a=k+a;
				}
			}else {
				if (k.equals(" ")) {
					flag=true;
					answer=answer+" "+a;
					a="";
				}else {
					a=k+a;
				}
			}
		}
		if (a.length()!=0) {
				answer=answer+" "+a;
		}
		if (answer.length()==0) {
				return "";
			}
		while (answer.substring(0,1).equals(" ")) {
		    if (answer.length()==1) {
				return "";
			}
		    answer=answer.substring(1, answer.length());
		}
		return answer;
	}
}

<think> 问题:在Google Earth Engine (GEE) 中,出现错误“ee.Algorithms.Type is not a function” 原因:在GEE中,`ee.Algorithms`并没有一个名为`Type`的函数。因此,我们需要使用其他方法来检查对象的类型。 解决方案:我们可以使用`name`方法来获取对象的类型名称,或者使用`instanceof`操作符(在客户端JavaScript中)来检查类型。但是请注意,在GEE的服务器端对象(如ee.Object)中,我们不能直接使用JavaScript的`typeof`或`instanceof`。因此,我们可以通过以下方式来处理: 1. 对于服务器端对象,我们可以使用`ee.Algorithms.ObjectType`来获取类型(注意:这个函数可能也不存在,实际上GEE并没有提供直接获取对象类型的函数)。 2. 另一种方法是使用`ee.Algorithms.Describe`来获取对象的描述信息,然后解析其中的类型信息。 然而,经过查阅GEE文档,并没有直接获取对象类型的函数。所以,通常的做法是我们知道我们处理的对象的类型,或者通过打印描述信息来调试。 但是,在调试时,我们可以使用`print`语句打印对象的描述信息,然后查看类型。例如: ```javascript print(ee.Algorithms.describe(lon)); ``` 这将在控制台输出该对象的描述信息,包括其类型。 但是,在代码中我们无法直接使用一个函数来返回类型字符串。因此,我们可能需要避免在代码中动态判断类型,而是确保我们转换后的对象是数字类型。 所以,我们修改之前的代码,去掉类型检查的部分,确保使用`ee.Number.parse`将字符串转换为数字。如果转换失败,则可能是字符串格式不正确。 修改后的代码(去掉类型检查): ```javascript var csvAsset = ee.FeatureCollection('projects/ee-heyunqi98/assets/sampled_data_1'); var points = csvAsset.map(function(feature) { var lonStr = feature.get('lon'); var latStr = feature.get('lat'); // 转换为数字 var lon = ee.Number.parse(lonStr); var lat = ee.Number.parse(latStr); // 创建点 var point = ee.Geometry.Point([lon, lat]); return feature.setGeometry(point); }); Map.addLayer(points, {color: 'red'}, 'CSV Points'); ``` 但是,为了调试,我们可以打印一些信息来确保转换成功: ```javascript var csvAsset = ee.FeatureCollection('projects/ee-heyunqi98/assets/sampled_data_1'); // 取第一个特征来检查 var first = csvAsset.first(); print('First feature:', first); print('Lon string:', first.get('lon')); var lonNum = ee.Number.parse(first.get('lon')); print('Lon number:', lonNum); // 然后执行映射 var points = csvAsset.map(function(feature) { var lon = ee.Number.parse(feature.get('lon')); var lat = ee.Number.parse(feature.get('lat')); return feature.setGeometry(ee.Geometry.Point([lon, lat])); }); Map.addLayer(points, {color: 'red'}, 'CSV Points'); ``` 如果仍然遇到问题,可能是数据中有非数字字符串,我们可以使用`ee.Algorithms.If`来处理无效值,例如: ```javascript var points = csvAsset.map(function(feature) { var lon = ee.Number.parse(feature.get('lon')); var lat = ee.Number.parse(feature.get('lat')); // 检查转换后的数字是否有效(例如,经度在-180到180之间) var isValid = lon.abs().lte(180).and(lat.abs().lte(90)); var point = ee.Algorithms.If(isValid, ee.Geometry.Point([lon, lat]), null // 无效时返回null,后续过滤掉 ); // 设置几何,如果是无效点,几何为null feature = feature.setGeometry(point); return feature; }); // 过滤掉几何为null的特征 points = points.filter(ee.Filter.notNull(['geometry'])); ``` 这样,我们就避免了无效点。 因此,我们不需要使用`ee.Algorithms.Type`,而是通过其他方式确保类型正确。 下面提供一个完整的可运行示例,包含错误处理: ```javascript // 加载资产 var csvAsset = ee.FeatureCollection('projects/ee-heyunqi98/assets/sampled_data_1'); // 转换并过滤 var points = csvAsset.map(function(feature) { // 获取字符串并转换为数字 var lon = ee.Number.parse(feature.get('lon')); var lat = ee.Number.parse(feature.get('lat')); // 验证数字是否有效(这里简单检查范围,也可以检查是否为null等) var validLon = lon.abs().lte(180); var validLat = lat.abs().lte(90); var isValid = validLon.and(validLat); // 如果有效,创建点;否则返回null(在后续过滤) var point = ee.Algorithms.If(isValid, ee.Geometry.Point([lon, lat]), null); // 设置几何 return feature.setGeometry(point); }); // 过滤掉无效点 points = points.filter(ee.Filter.notNull(['geometry'])); // 添加到地图 Map.addLayer(points, {color: 'red'}, 'CSV Points'); Map.centerObject(points, 10); ``` 注意:在`ee.Algorithms.If`中,`ee.Geometry.Point`和`null`必须是同一类型,但实际上`setGeometry`可以接受null,然后我们通过过滤去掉这些特征。 如果仍然有问题,我们可以使用客户端函数来处理,但要注意,当数据量很大时,客户端函数可能效率低下。因此,我们尽量使用服务器端函数。 另外,如果数据量不大,我们可以使用`evaluate`来检查,但这通常用于调试,不用于生产。 因此,我们修改后的代码避免了使用`ee.Algorithms.Type`,而是通过范围验证来确保点的有效性。 如果问题仍然存在,请检查CSV中的经纬度列名是否正确,以及数据中是否有非数字的字符串(如空字符串、非数字字符等)。我们可以通过打印列名和部分数据来检查。 例如: ```javascript // 打印列名 print('Columns:', csvAsset.first().propertyNames()); // 打印前5个特征的lon和lat print('First 5 features lon:', csvAsset.aggregate_array('lon').slice(0,5)); print('First 5 features lat:', csvAsset.aggregate_array('lat').slice(0,5)); ``` 这些打印将帮助确认数据内容。 综上所述,我们解决了类型错误和类型检查的问题。 §§相关问题§§: 1. 如何在GEE中处理CSV中的空值或缺失值? 2. 如何将GEE中的点数据导出为KML文件? 3. 如何根据属性值设置不同的点样式(例如不同颜色)? 4. 如何在GEE中加载本地的CSV文件(而不是先上传为资产)? </think> # 解决 "ee.Algorithms.Type is not a function" 错误 这个错误表明您尝试使用了 `ee.Algorithms.Type()` 方法,但这个方法在 Earth Engine 中并不存在。让我提供一个完整的解决方案来调试和修复这个问题: ## 正确调试类型的解决方案 ```javascript // 1. 加载CSV资产 var csvAsset = ee.FeatureCollection('projects/ee-heyunqi98/assets/sampled_data_1'); // 2. 打印第一条记录进行调试 var firstFeature = csvAsset.first(); print('First feature:', firstFeature); // 3. 获取经纬度属性 var lon = firstFeature.get('lon'); var lat = firstFeature.get('lat'); // 4. 正确检查类型的方法 print('Lon type:', lon); // Earth Engine 会自动显示类型信息 print('Lon constructor:', lon.constructor); // 显示构造函数名 // 5. 使用 ee.Algorithms.describe() 获取详细类型信息 print('Lon description:', ee.Algorithms.describe(lon)); // 6. 转换和验证函数 var convertToNumber = function(value) { // 如果已经是数字类型,直接返回 if (ee.Number(value).getInfo() !== null) { return ee.Number(value); } // 尝试解析字符串 var parsed = ee.Number.parse(value); // 验证是否为有效数字 var isValid = parsed.isFinite(); return ee.Algorithms.If( isValid, parsed, ee.Number(0) // 无效值默认为0 ); }; // 7. 正确创建点几何 var points = csvAsset.map(function(feature) { var lon = convertToNumber(feature.get('lon')); var lat = convertToNumber(feature.get('lat')); // 创建点几何 var point = ee.Geometry.Point([lon, lat]); return feature.setGeometry(point); }); // 8. 添加到地图 Map.addLayer(points, {color: 'blue', pointSize: 3}, 'Converted Points'); Map.centerObject(points, 10); ``` ## 关键解决方案说明 ### 1. 正确的类型检查方法 Earth Engine 没有直接的 `ee.Algorithms.Type()` 函数。正确的方法是: - 使用 `print(value)` - 控制台会显示值的类型 - 使用 `ee.Algorithms.describe(value)` - 返回包含类型信息的对象 - 使用 `value.constructor()` - 返回构造函数名 ### 2. 类型转换函数 创建 `convertToNumber` 函数处理各种可能的类型: ```javascript var convertToNumber = function(value) { // 处理数字类型 if (ee.Number(value).getInfo() !== null) { return ee.Number(value); } // 处理字符串类型 if (ee.String(value).length().getInfo() > 0) { return ee.Number.parse(value); } // 处理其他类型 return ee.Number(0); // 默认值 }; ``` ### 3. 调试不同类型的数据 根据数据类型采取不同处理: ```javascript var value = feature.get('some_column'); // 检查类型并相应处理 var valueType = value.constructor && value.constructor.name; print('Value type:', valueType); if (valueType === 'String') { // 处理字符串 } else if (valueType === 'Number') { // 已经是数字 } else { // 其他类型处理 } ``` ### 4. 完整错误处理流程 ```javascript var points = csvAsset.map(function(feature) { var lon = feature.get('lon'); var lat = feature.get('lat'); // 调试日志 print('Raw lon:', lon, 'Type:', lon.constructor.name); // 转换逻辑 var processCoordinate = function(coord) { try { // 尝试直接转换为数字 var num = ee.Number(coord); if (num.isFinite()) return num; // 尝试解析字符串 return ee.Number.parse(coord); } catch (e) { // 错误处理 print('Conversion error:', e); return ee.Number(0); } }; var lonNum = processCoordinate(lon); var latNum = processCoordinate(lat); // 验证坐标范围 var validLon = lonNum.gte(-180).and(lonNum.lte(180)); var validLat = latNum.gte(-90).and(latNum.lte(90)); return ee.Algorithms.If( validLon.and(validLat), feature.setGeometry(ee.Geometry.Point([lonNum, latNum])), null // 无效点返回null ); }).filter(ee.Filter.notNull()); // 过滤掉无效点 ``` ## 完整可运行示例 ```javascript // 加载CSV资产 var csvAsset = ee.FeatureCollection('projects/ee-heyunqi98/assets/sampled_data_1'); // 打印列名和前5个值 print('Column names:', csvAsset.first().propertyNames()); print('First 5 lon values:', csvAsset.aggregate_array('lon').slice(0, 5)); print('First 5 lat values:', csvAsset.aggregate_array('lat').slice(0, 5)); // 类型转换函数 var safeConvert = function(value) { // 如果已经是数字类型 if (ee.Number(value).getInfo() !== null) { return ee.Number(value); } // 尝试解析字符串 var parsed = ee.Number.parse(value); // 验证是否为有效数字 return ee.Algorithms.If( parsed.isFinite(), parsed, ee.Number(0) ); }; // 创建点几何 var points = csvAsset.map(function(feature) { var lon = safeConvert(feature.get('lon')); var lat = safeConvert(feature.get('lat')); // 验证坐标范围 var isValid = lon.gte(-180).and(lon.lte(180)) .and(lat.gte(-90).and(lat.lte(90))); return ee.Algorithms.If( isValid, feature.setGeometry(ee.Geometry.Point([lon, lat])), feature // 保持原样但不设置几何 ); }); // 过滤有效点 var validPoints = points.filter(ee.Filter.notNull(['geometry'])); // 添加到地图 Map.addLayer(validPoints, { color: 'FF0000', pointSize: 5, pointShape: 'circle', width: 1, fillColor: '00FF00' }, 'Valid Points'); // 添加无效点图层(用于调试) var invalidPoints = points.filter(ee.Filter.isNull(['geometry'])); Map.addLayer(invalidPoints, {color: 'yellow'}, 'Invalid Points'); // 自动缩放 Map.centerObject(validPoints, 8); // 打印统计信息 print('Total features:', csvAsset.size()); print('Valid points:', validPoints.size()); print('Invalid points:', invalidPoints.size()); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值