说我有一个点(0,0),我说它将被用作原点。如何检查以下点(在数组中)是否与原点共享相同的斜率。
要点是:
(6000, 7000) (10000, 0) (16000, 17000) (7000, 3000)
(3000, 7000) (20000, 21000) (3000, 4000) (0, 10000).
基本上我想比较与原点相关的每个点,看看哪些点共享相同的斜率,并将这些点组合在不同的列表中。我对它背后的算法和逻辑感到有些困惑。我知道for循环是最好的,但它的实现似乎离我而去
for (int j = 0; j < array.length - 1; i++)
这是我开始失去理智的地方。
答案 0 :(得分:1)
您所描述的方法是正确的。您希望“查看哪些共享相同的斜率并将这些点组合在一起显示在单独的列表中”。
您可以使用Map
为您处理分组,例如:
Map<BigDecimal, List<Point>> lists = new HashMap<BigDecimal, List<Point>>();
for (Point point : points) {
BigDecimal slope = new BigDecimal(point.getY()).divide(new BigDecimal(point.getX()));
List<Point> list = lists.get(slope);
if (list == null) {
list = new ArrayList<Point>();
lists.put(slope, list);
}
list.add(point);
}
请注意,这使用任意精度BigDecimal
类来避免与原始浮点类型的舍入相关的问题。如果您对此不关心,可以改用Double
和double
。
答案 1 :(得分:0)
创建一个点列表,迭代列表,计算斜率并根据地图中的每个计算斜率维护点列表,如下所示:
List<int[]> myPoints = new ArrayList<int[]>();
int[] point1 = new int[]{6000, 7000};
myPoints.add(point1);
int[] point2 = new int[]{10000, 0};
myPoints.add(point2);
int[] point3 = new int[]{16000, 17000};
myPoints.add(point3);
Map<Float, List<int[]>> myMatchingSlopePoints = new HashMap<Float, List<int[]>>();
for(int[] point: myPoints){
Float slope = new Float(point[1]/point[0]);
if(myMatchingSlopePoints.get(slope) == null){
//create a new list as this slope doesn't match with previous one
myMatchingSlopePoints.put(slope, new ArrayList<int[]>());
}
//add the slope to match list
myMatchingSlopePoints.get(slope).add(point);
}
//retrieve various slope
Set<Float> variousFloats = myMatchingSlopePoints.keySet();
//retrieve mathing points for each slope
for(Float slope: variousFloats){
List<int[]> matchingPointsListForSlope = myMatchingSlopePoints.get(slope);
//use matching points
}