71. Simplify Path | Java最短代码实现

本文深入探讨了简化路径问题,通过栈的基本操作实现路径简化。详细解释了算法逻辑,包括跳过分隔符、记录文件名及处理特殊指令,最终得到简化后的路径。
原题链接:71. Simplify Path

【思路】

本题考查字符串和栈的基本操作。本身并不难:

    public String simplifyPath(String path) {
        Stack<String> stack = new Stack<String>();
        String temp = "";
        for (int i = 0; i < path.length(); i++) {
            while (i < path.length() && path.charAt(i++) == '/')  //跳过'/'
                i++;
            while (i < path.length() && path.charAt(i) != '/') {  //将文件名记录在temp中
                temp += path.charAt(i);
                i++;
            }
            if (temp.equals("..") && !stack.isEmpty())  //如果为"..",且栈不空,弹出第一个(返回上一级目录)
                stack.pop();
            else if (!temp.equals(".") && !temp.equals("..") && !temp.equals(""))  //入栈
                stack.add(temp);
            temp = "";
        }
        while (!stack.isEmpty())
            temp = "/" + stack.pop() + temp;
        return temp == "" ? "/" : temp;
    }
252 / 252  test cases passed. Runtime: 11 ms  Your runtime beats 63.37% of javasubmissions.
欢迎优化!

<think>我们面对的问题:在Java ArcObject中执行`topoOp.simplify()`时,如何避免改动原坐标点值? 分析:`ITopologicalOperator.simplify()`方法会直接修改几何对象本身,以修正拓扑(包括环方向)。如果我们不希望改变原始几何的坐标点值,那么我们需要在简化之前创建一个几何的副本,然后对这个副本进行操作。 步骤: 1. 复制原始几何对象,得到一个副本。 2. 将副本转换为`ITopologicalOperator`接口。 3. 对副本调用`simplify()`方法,这样原始几何保持不变,而副本被修正。 关键点:如何正确复制几何对象?在ArcObjects中,几何对象通常实现`IClone`接口,我们可以使用该接口的`clone`方法进行复制。 代码示例: ```java import com.esri.arcgis.geometry.IGeometry; import com.esri.arcgis.geometry.ITopologicalOperator; import com.esri.arcgis.geometry.Polygon; import com.esri.arcgis.system.IClone; public class GeometryUtil { /** * 修正环方向但不改变原始几何 * @param originalPolygon 原始多边形 * @return 修正后的新多边形(原始几何保持不变) */ public static IPolygon simplifyWithoutModifyingOriginal(IPolygon originalPolygon) { // 1. 使用IClone接口复制几何 IClone cloneable = (IClone) originalPolygon; IGeometry clonedGeometry = (IGeometry) cloneable.clone(); // 2. 将复制的几何转换为ITopologicalOperator ITopologicalOperator topoOp = (ITopologicalOperator) clonedGeometry; // 3. 执行简化(修正环方向) topoOp.simplify(); // 4. 返回修正后的几何(原始几何未变) return (IPolygon) clonedGeometry; } public static void main(String[] args) { // 创建或获取原始多边形(示例) IPolygon original = new Polygon(); // ... 添加点构成多边形(省略) // 在不改变原始几何的情况下修正环方向 IPolygon simplified = simplifyWithoutModifyingOriginal(original); // 此时,original保持不变,simplified是修正后的新几何 } } ``` 注意事项: - 此方法适用于任何实现`IClone`和`ITopologicalOperator`的几何类型(如`Polygon`, `Polyline`等)。 - 修正后的几何副本将具有正确的环方向(外部环顺时针,内部环逆时针)以及简化的拓扑结构。 - 如果原始几何已经满足拓扑要求,`simplify()`可能不会改变几何,但为了确保原始几何不被修改,复制步骤是必要的。 引用说明: - 使用`IClone`接口复制几何是ArcObject中的标准做法[^1]。 - 环境配置和依赖项管理参考之前的说明(如32位JDK、ArcObjects.jar版本匹配等)[^1][^2][^3]。 这种方法确保了原始坐标点值不被修改,同时得到了修正环方向后的新几何。 §§相关问题§§ 1. 在ArcObject中复制几何对象有哪些其他方法? 2. 如何判断一个多边形环的方向(顺时针或逆时针)? 3. 除了简化操作,还有哪些方法可以修正多边形的环方向? </think>### 在Java ArcObject中执行`topoOp.simplify()`不改动原坐标点值的方法 `ITopologicalOperator.simplify()`方法会直接修改几何对象的坐标值以修正拓扑错误(包括环方向)。如果您需要保持原始坐标点不变,可以通过以下两种方法实现: #### 方法1:创建几何副本后再简化(推荐) ```java import com.esri.arcgis.geometry.*; import com.esri.arcgis.system.IClone; public class SafeSimplify { public static IPolygon simplifyWithoutModification(IPolygon polygon) { // 1. 创建几何副本 IClone cloneable = (IClone) polygon; IPolygon clonedPoly = (IPolygon) cloneable.clone(); // 2. 对副本执行简化 ITopologicalOperator topoOp = (ITopologicalOperator) clonedPoly; topoOp.simplify(); // 修正环方向但不影响原始几何 return clonedPoly; // 返回修正后的副本 } } ``` **优点**: - 原始几何坐标完全保持不变 - 符合ArcObject的标准克隆模式 - 适用于任何实现了`IClone`接口的几何类型 #### 方法2:使用GeometryBag批量处理(高效方案) ```java import com.esri.arcgis.geometry.*; import com.esri.arcgis.geodatabase.*; public class BatchSimplify { public static void safeBatchSimplify(IFeatureClass featureClass) throws Exception { // 1. 创建空GeometryBag IGeometryBag geomBag = new GeometryBag(); IGeometryCollection geomColl = (IGeometryCollection) geomBag; // 2. 提取原始几何并复制到GeometryBag IFeatureCursor cursor = featureClass.search(null, false); IFeature feature; while ((feature = cursor.nextFeature()) != null) { IGeometry geom = feature.getShapeCopy(); IGometryBridge gBridge = new GeometryEnvironment(); gBridge.AddGeometry(geom, geomColl, null); // 添加几何副本 } // 3. 批量简化GeometryBag中的副本 ITopologicalOperatorBatch topoBatch = (ITopologicalOperatorBatch) geomBag; topoBatch.simplify(); // 修正所有几何的环方向 // 4. 更新要素(原始坐标保留在feature中) cursor = featureClass.update(null, false); int i = 0; while (cursor.nextFeature() != null) { feature = cursor.nextFeature(); feature.setShape(geomColl.getGeometry(i)); // 使用修正后的副本 cursor.updateFeature(feature); i++; } } } ``` **适用场景**: - 批量处理要素类中的多个多边形 - 需要保持原始要素坐标不变 - 高性能处理大型数据集 #### 关键说明: 1. **环方向修正原理**: - 外部环:修正为顺时针方向 - 内部环(孔洞):修正为逆时针方向 - 拓扑错误:自动修复自相交等问题 ```mermaid graph LR A[原始几何] -->|外部环逆时针| B(拓扑错误) A -->|内部环顺时针| B C[简化后的几何] -->|外部环顺时针| D(正确拓扑) C -->|内部环逆时针| D ``` 2. **性能优化**: - 对于密集多边形,使用`IGeometryBridge`代替`IClone`提升复制效率 - 批量操作时开启编辑会话: ```java IWorkspaceEdit workspaceEdit = (IWorkspaceEdit) featureClass.getWorkspace(); workspaceEdit.startEditing(false); workspaceEdit.startEditOperation(); // 执行批量简化 workspaceEdit.stopEditOperation(); workspaceEdit.stopEditing(true); ``` 3. **坐标精度保护**: - 在复制前设置`IClone.IsCoincident`接口跳过重复点 - 使用`ITransform2D`进行坐标系转换时保持精度 > **重要提示**:ArcObject 10.4及更早版本仅支持32位JDK 1.8环境,需确保正确配置环境变量[^1][^2]。Maven依赖需与ArcGIS版本严格匹配[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值