嘿,我有一个关联数组,其键为String,值为Int。 所以从那个关联数组我需要得到具有最高值的键,如果多个键具有相同的值,那么我需要具有最高长度的键。
那么最有效的方法是什么?
例如
float matchresult = 1;
p_capWebcam = cvCaptureFromCAM(0);
cvNamedWindow("Original", CV_WINDOW_AUTOSIZE);
if (p_capWebcam != NULL)
{
while (true)
{
IplImage *frame = cvQueryFrame(p_capWebcam);
cvShowImage("WEBCAM_TEST", frame);
cvWaitKey(20);
}
}
else
{
std::cout << "CAMERA NOT DETECTED" << std::endl;
}
IplImage * tableauxImage[6];
for (int i = 0; i<6; i++)
{
tableauxImage[i] = cvLoadImage(alphabetTable[i], CV_LOAD_IMAGE_GRAYSCALE);
}
while (1){
p_imgOriginal = cvQueryFrame(p_capWebcam);
p_gray = cvCreateImage(cvGetSize(p_imgOriginal), 8, 1);
cvFlip(p_imgOriginal, p_imgOriginal, 1);
cvCvtColor(p_imgOriginal, p_gray, CV_BGR2GRAY);
cvSetImageROI(p_gray, cvRect(100, 100, 200, 200));
cvThreshold(p_gray, p_gray, 100, 255, CV_THRESH_BINARY_INV);
MainWindow::draw_box(p_imgOriginal, cvRect(100, 100, 200, 200));
// when show Roi Button is clicked
if (showGray == true) {
cvNamedWindow("template gray", CV_WINDOW_AUTOSIZE);
cvShowImage("template gray", p_gray);
}
cvShowImage("Original", p_imgOriginal);
for (int i = 0; i<6; i++){
if (startmatching == true)
matchresult = MainWindow::match_two_shapes(tableauxImage[i], p_gray);
if (matchresult<0.1){
ui->signname->setText(QString(convertstring(alphabetTable[i])[0])); //good match
timer1->start(1000);
}
else {
if (matchresult<0.25)
color = cvScalar(0x00, 0xff, 0x00);
else
color = cvScalar(0x00, 0x00, 0xff);
}
ui->matchresultlabel->setText(QString::number(matchresult));
}
charCheckForEscKey = cvWaitKey(ui->Delais->value());// delay (in ms), and get key press, if any
if ((charCheckForEscKey == 27) || (stopCapture))
break;
}
for (int i = 0; i < 6; i++)
{
cvReleaseImage(&tableauxImage[i]);
}
cvReleaseCapture(&p_capWebcam);
cvDestroyAllWindows();
因此,我应该将输出作为adsfefs
答案 0 :(得分:4)
您可以使用array_keys
并传递第二个参数来过滤返回的密钥,仅包含max
个密钥。然后,您可以使用array_reduce
和一个检查字符串长度并抛出最短字符串的函数找到最长的密钥,如下所示:
$array = array(
'abc' => 10,
'def' => 8,
'fff' => 3,
'abcr' => 10,
'adsfefs' => 10
);
$keys = array_keys($array, max($array));
$longestKey = array_reduce($keys, function ($a, $b) { return strlen($a) > strlen($b) ? $a : $b; });
var_dump($longestKey);
请注意,如果有两个或更多相同长度的字符串,则会返回最后一个字符串。
答案 1 :(得分:0)
arsort(array)
按价值对其进行反向排序foreach结果数组。将每个密钥以格式
存储在其他数组中[key] => strlen(key);
所以arsort(other_array)
并取第一个元素。它应该是具有最长键的键(但要注意,如果有许多键具有相同的长度,则应添加一些其他条件以在它们之间进行选择)。
<?php
$sid = array(
'abc' => 10,
'def' => 8,
'fff' => 3,
'abcr' => 10,
'adsfefs' => 10
);
arsort($sid);
$prev_val = null;
$keys = Array();
foreach ($sid as $k=>$v) {
if ($k < $prev_val) break;
$keys[$k] = strlen($k);
$prev_val = $k;
}
arsort($keys);
echo "Longest key with highest value is: " . array_keys($keys)[0] . "\n";
?>
答案 2 :(得分:0)
使用arsort($data);
执行值数据的初始排序,然后使用array_values
标识最大值。使用最大值查找哪些键具有此值,然后迭代并找到最长的键值。
$data = array('bob' => 3, 'rob' => 4, 'nigel' => 6,'john' => 6, 'tony' => 6 );
// Sort array in descending value order
arsort($data);
// Get the first value (will be the largest value)
$maxValue = array_values($data)[0];
// Get an array of all keys with this value
$keys = array_keys($data, $maxValue);
// Find longest key
$maxKey = '';
foreach ($keys as $key) {
if (strlen($key) > strlen($maxKey)) {
$maxKey = $key;
}
}
// Output
print "Largest Value = $maxValue\n";
print "Largest Key with value of $maxValue is $maxKey\n";