将数组中的一个元素与同一数组中的所有其他元素进行比较

时间:2016-10-24 12:58:31

标签: c arrays loops compare

我知道我们可以用这种方式将数组的每个元素相互比较:

    for (f = 0; f < length2; f++) {
    for (p = f + 1; p < length2 ; p++) {
        if(!(compareThem(split[f],split[p]) == 1) && (split[f] != 0) && (split[p] != 0)) {
            no_of_unique++;
        }
    }
}

但是,我只想在使用索引p的所有元素检查索引f的元素后增加no_of_unique。然而,这用p = f + 1检查元素f,增加no_of_unique,然后检查其他元素并为每种情况增加它。在检查了所有元素后,我只需要增加它。任何帮助,将不胜感激。

P.S compareThem函数基本上只返回1,如果它们彼此相等。

2 个答案:

答案 0 :(得分:1)

在内部循环范围内增加 no_of_unique ,而不是在找到等于 split [f] 的元素后中断。然后,在内循环之外,你应该检查 p 是否等于 length2 ,这意味着内循环没有破坏并遍历所有元素直到结束数组。 (即没有遇到等于 split [f]

的元素
for (f = 0; f < length2; f++) {
    if (split[f] != 0) {
        for (p = 0; p < length2 ; p++) {
            if( f != p && (split[p] != 0) && (compareThem(split[f],split[p]) == 1)) {
                break;
            }
        }
        if (p == length2) {
            no_of_unique++;
        }
    }
}

答案 1 :(得分:0)

我正在阅读你的问题的方式,因为标题是&#34;将一个元素与所有相同数组中的其他元素进行比较,&#34;您想要查找数组中唯一元素的数量。对于数组中的每个元素,您必须确定它后面是否有重复项,但也必须在它之前。这是一个解决方案。我在我的示例中使用了字符数组,但您可以轻松地将其应用于其他类型。 countUnique()函数执行正向搜索重复项,当它找到潜在的唯一元素时,alreadyFound()函数检查前面的元素。:

#include <stdio.h>
#include <string.h>

int countUnique(char arr[], int n);
int compareThem(char c1, char c2);
int alreadyFound(char c, char list[], int n);

int main(void)
{
    char test1[] = "abcababdb";
    int s_len = strlen(test1);

    printf("test1: %d unique elements\n", countUnique(test1, s_len));

    return 0;
}
int countUnique(char arr[], int n)
{
    int no_of_unique = 0;
    int f, p;

    for (f = 0; f < n; f++) {
        for (p = f + 1; p < n; p++) {
            if(compareThem(arr[f],arr[p]) == 1)
                break;
        }
        if (p == n && !alreadyFound(arr[f], arr, f)) {
            no_of_unique++;
        }
    }

    return no_of_unique;
}

int compareThem(char c1, char c2)
{
    if (c2 - c1)
        return 0;
    return 1;
}

int alreadyFound(char c, char list[], int n)
{
    int i;
    for (i = 0; i < n; i++) {
        if (c == list[i])
            return 1;
    }

    return 0;
}