繁体   English   中英

如何在Java中获取数组的第一个和最后一个值之间的元素索引

[英]How to get index of elements between the first and last values of an array in Java

我正在开发一个程序,其中我将一种颜色与阵列中的其他颜色进行比较。 我使用欧几里得色彩距离公式( wiki链接 )确定两种颜色之间的色彩距离,但是我想做的是获取第二,第三和第四最小值的索引,因此我可以将这些索引的值分配给的值。它被比较。 这是我尝试过的。

private void findUnknownColors(Color[] firstAnchor, Color[] foundAnchor){
    //Find distance between each color in first anchor and color arr

    double[] storeClosestColors = new double [24];
    //fill the array with a random value.
    Arrays.fill(storeClosestColors, 5000);

    for(int i = 0; i < colorArray.length; i++){
        storeClosestColors[i] = colorDistance(firstAnchor[0], colorArray[i]);
        if(i < storeClosestColors[2]){
            storeClosestColors[2] = i;
        }
    }
//get 3 closest colors disregarding 0.0
    System.out.println("Closest colors: " + Arrays.toString(storeClosestColors));   
}

这是我比较颜色以及确定彼此之间差异的方式。 它返回一个表示其差异的浮点值。 距离越近,它们在RGB光谱上的距离就越大。

public double colorDistance(Color c1, Color c2) {
    double rmean = (c1.getRed() + c2.getRed()) / 2;
    int r = c1.getRed() - c2.getRed();
    int g = c1.getGreen() - c2.getGreen();
    int b = c1.getBlue() - c2.getBlue();
    double weightR = 2 + rmean / 256;
    double weightG = 4.0;
    double weightB = 2 + (255 - rmean) / 256;
    //System.out.println(Math.sqrt(weightR * r * r + weightG * g * g + weightB * b * b));
    return Math.sqrt(weightR * r * r + weightG * g * g + weightB * b * b);
}

这是输出。

Color array: [java.awt.Color[r=171,g=162,b=184], java.awt.Color[r=103,g=7,b=10], java.awt.Color[r=183,g=60,b=67], java.awt.Color[r=111,g=20,b=37], java.awt.Color[r=0,g=4,b=45], java.awt.Color[r=72,g=127,b=57], java.awt.Color[r=171,g=172,b=199], java.awt.Color[r=83,g=146,b=89], java.awt.Color[r=146,g=171,b=62], java.awt.Color[r=0,g=3,b=30], java.awt.Color[r=165,g=61,b=49], java.awt.Color[r=140,g=181,b=78], java.awt.Color[r=155,g=22,b=22], java.awt.Color[r=170,g=151,b=64], java.awt.Color[r=5,g=10,b=64], java.awt.Color[r=155,g=147,b=173], java.awt.Color[r=34,g=131,b=51], java.awt.Color[r=140,g=165,b=51], java.awt.Color[r=1,g=15,b=63], java.awt.Color[r=30,g=139,b=64], java.awt.Color[r=178,g=168,b=188], java.awt.Color[r=170,g=36,b=33], java.awt.Color[r=113,g=26,b=46], java.awt.Color[r=112,g=25,b=44]]
Closest colors: [271.20551190471775, 188.49519224638064, 0.0, 148.0690295098877, 304.4738994868854, 221.26990553111827, 301.1983358187757, 236.5966372330765, 230.12584023475068, 309.0199161765306, 40.283177320067495, 252.41092952514953, 112.21335008589664, 183.30020415632384, 291.59154464121553, 242.0912147311422, 273.11361532336684, 222.63613286313162, 293.7586168948921, 285.47859349476624, 283.3636066853858, 73.66764469561926, 135.36298134552888, 138.41173575152507]

我想我可以给您一些有关如何做自己想做的建议(根据我的理解)。

  • 从颜色C (*)计算colorDistance的每种颜色的colorArray ,并以与colorArray的颜色相同的顺序存储每种颜色的距离。 让我们将数组命名为colorDistances 因此, colorDistances[i] = Distance between colorArray[i] and C
  • 复制colorDistances数组。 让我们将数组命名为colorDistancesCopy
  • colorDistancesCopy执行插入排序 在进行排序时,请跟踪每个步骤(**)中colorDistancesCopy元素的索引变化。
  • 如果正确完成了上一步,那么在该步骤的最后,您应该具有按排序顺序的colorDistancesCopy ,以及未排序的colorDistances数组中每个元素的顺序。 根据这些信息,您可以轻松地从颜色C确定colorArray的第二,第三,第四最接近的颜色。

(*):从您的代码中,我看到的是C的值将来自数组( firstAnchor )。 在这种情况下,如果必须使用firstAnchor所有值,那么您将不得不重复执行该过程。

(**):要轻松跟踪每个步骤中的索引更改,您将需要两个附加数组-一个将存储未排序数组中已排序元素的位置,另一个将存储未排序元素的顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM