Java 检查几何形状

Java 检查几何形状,java,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

我有一个由四(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]++;
}
静态无效检查类型(int[]arr,int[]check){
Map Map=newhashmap();
对于(int i=0;i

代码仍然不起作用。感谢您的帮助。

您的代码适用于正方形,即当所有边都相等且地图中只有一个条目时。它还将适用于地图中的两个以上条目,并将表示它是另一个多边形

但是,您的代码的问题是,您假设只有在矩形的情况下map中才会有两个条目,但事实并非如此

例如,
{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]++;
}
else if(map.size()==2){
int-cnt=0;
对于(Map.Entry:Map.entrySet()){
cnt=(cnt==0)?entry.getValue():(cnt==entry.getValue()?cnt:-1);
}
如果(cnt!=-1)
检查[1]++;
其他的
检查[2]++;
}

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

添加枚举可能会使代码更易于理解

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);
        }
    }
}

你有没有试过用调试器一步一步地检查代码?随机迭代器是怎么回事?哎呀,这是多余的。请忽略。使用集合,无需映射:
Sets.newHashSet(arr).size()
(使用番石榴)如果1是正方形,如果2是矩形等,请详细说明代码是如何工作的?你得到了什么结果?
RECTANGLE=1
SQUARE=1
OTHER=3