Java 检查几何形状
我有一个由四(4)个数字组成的数组,表示多边形的边,顺序为a、B、C和D。我需要检查数组并确定多边形是正方形、矩形还是其他多边形 我在检查数组的索引0,1,2中跟踪正方形,矩形和多边形 这是我当前的代码: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
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