检查几何形状

时间:2016-02-23 16:51:59

标签: java

我有一个四(4)个数字的数组,以A,B,C和D的顺序表示多边形的边。我需要检查数组并确定多边形是方形,是矩形还是不是其他多边形。

我在检查数组的索引0,1,2中跟踪正方形,矩形和多边形。

这是我目前的代码:

static void checkType(int[] arr, int[] check) {
    Map<Integer, Integer> map = new HashMap<>();

    for (int i = 0; i < arr.length; i++) {
        if (map.containsKey(arr[i])) {
            map.put(arr[i], map.get(arr[i]) + 1);
        } else {
            map.put(arr[i], 1);
        }
    }

    if (map.size() == 1) check[0]++;
    else if (map.size() == 2) check[1]++;
    else check[2]++;
}

代码仍无效。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

您的代码适用于正方形,即当所有边都相等且地图中只有一个条目时。它也适用于地图中的两个以上的条目,并且会说它是其他多边形。

但是,你的代码的问题是你假设只有在矩形的情况下才会在地图中有两个条目,但这不是真的。

例如,{2,2,4,2}这里地图中只有两个条目,但这显然不是一个矩形!

你的逻辑是正确的。您只需为mapSize() == 2添加一个条件,以确保它是矩形。

而不是这样做:

else if (map.size() == 2) check[1]++;

请改为:

else if (map.size() == 2) {
    int cnt = 0;
    for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
        cnt = (cnt == 0) ? entry.getValue() : (cnt == entry.getValue() ? cnt : -1);
    }
    if(cnt != -1)
        check[1]++;
    else
        check[2]++;
}

答案 1 :(得分:1)

我相信您正在尝试计算边的出现次数,以确定几何形状是矩形,正方形还是其他形状。

添加枚举可能会使您的代码更容易理解。

randEntryValue方法将在地图中提取一个随机条目并检查其值。我们不关心检查哪个值,但我们必须确保该事件为2

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

public class PolygonChecker {
    private enum PolygonType {
        RECTANGLE,
        SQUARE,
        OTHER;
    }

    public static void main(String[] args) {
        Map<PolygonType, Integer> map = new HashMap<PolygonType, Integer>();

        checkType(new int[] {2, 4, 2, 4}, map);    // Rectangle
        checkType(new int[] {3, 3, 3, 3}, map);    // Square
        checkType(new int[] {4, 4, 4, 5}, map);    // Other
        checkType(new int[] {1, 2, 3, 4}, map);    // Other
        checkType(new int[] {1, 2, 3, 4, 5}, map); // Other

        Iterator<Entry<PolygonType, Integer>> it = map.entrySet().iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }

    static void checkType(int[] sideArr, Map<PolygonType, Integer> check) {
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();

        if (sideArr.length == 4) {
            for (int i = 0; i < sideArr.length; i++) {
                incr(map, sideArr[i], 1);
            }

            if (map.size() == 1) {
                incr(check, PolygonType.SQUARE, 1);
            } else if (map.size() == 2 && randEntryValue(map) == 2) {
                incr(check, PolygonType.RECTANGLE, 1);
            } else {
                incr(check, PolygonType.OTHER, 1);
            }
        } else {
            incr(check, PolygonType.OTHER, 1);
        }
    }

    @SuppressWarnings("unchecked")
    static <K> Entry<K, Integer> randEntry(Map<K, Integer> map) {
        Object[] entries = map.entrySet().toArray();
        return (Entry<K, Integer>) entries[(int) (Math.random() * entries.length)];
    }

    static <K> int randEntryValue(Map<K, Integer> map) {
        return randEntry(map).getValue().intValue();
    }

    // Generic increment function.
    static <K> void incr(Map<K, Integer> map, K key, int amount) {
        if (map.containsKey(key)) {
            map.put(key, map.get(key) + amount);
        } else {
            map.put(key, amount);
        }
    }
}

输出

RECTANGLE=1
SQUARE=1
OTHER=3