Java:查找数组是否至少包含3个具有相同值的元素

时间:2015-12-24 18:06:30

标签: java arrays

相当于标题所说的内容。我想过使用Sets并将大小与普通数组进行比较但是如果我有2个重复元素,则Set大小与一个元素有2个副本相同。

非常感谢任何有关如何处理此问题的帮助!

4 个答案:

答案 0 :(得分:0)

我认为最快的方法是蛮力方法,即遍历阵列并计算你想要计算的数量。您可以通过一个班轮调用的每个其他实现也必须遍历数组,使用HashMap添加开头来填充和维护映射,如果找到了搜索的内容,则无法停止迭代。

使用以下私人方法,您也可以通过主代码的单行调用来使用它:

    main()
    {
        String[] myArray = new String[] {
                                          "Hello",
                                          "Hello",
                                          "Hello",
                                          null,
                                          null,
                                           };
        boolean gotIt = hasAtLeastThreeOccurences( myArray, "Hello");
        myLog.debug( "gotIt: " + gotIt );
    }

private <T> boolean hasAtLeastThreeOccurences( T[] aArray, T aValue)
{
    int count = 0;
    boolean isNull = (aValue == null);

    for ( T t : aArray )
    {
        if ( isNull )
        {
            if ( t == null )
            {
                count++;
            }
        }
        else
        {
            if ( aValue.equals( t ) )
            {
                count++;
            }
        }

        if ( count >= 3 )
        {
            return true;
        }
    }

    return false;
}

答案 1 :(得分:0)

假设你的数组是一个字符串数组(仅作为一个例子),你可以调用这个方法,如果它返回null那么没有3个元素或更多具有相同的值,否则它将返回第一个元素发现3次或更多

public String getRedundantItem(String... myArray) {

    // Convert the array to List
    ArrayList<String> myList = new ArrayList<String>(Arrays.asList(myArray));

    // Look for the element which frequency is three or more
    for (String item : myList) {
        if (Collections.frequency(myList, item) > 2) {
            return item;
        }
    }

    // No element more than 2 times
    return null;
}

测试示例:

public void test(){     

    String[] someData = {"stack","over", "flow", "stack", "stack"};
    String[] otherData = {"stack","over", "flow", "stack", "flow"};

    System.out.println(getRedundantItem(someData)); // prints stack
    System.out.println(getRedundantItem(otherData)); // prints null

}

答案 2 :(得分:0)

如果数组有三个具有相同值的元素

我们保留:element =&gt;发生的次数。难以做得更少或更快

AdView

答案 3 :(得分:-1)

这是使用int变量的示例,但基本思想是将要与数组的其他值进行比较的值设置为第一个变量。然后当我们找到等于键的元素时,我们增加一个临时计数变量。如果临时计数变量大于实数计数变量,则实数计数变量将替换为临时计数变量。一旦找到不相等的元素,就会将新的键值设置为正在迭代的当前元素,并重置临时计数变量。但是,这可能会被修改,例如,一旦临时计数达到3,您就可以突破循环。我不确定这是不是你想要的,但享受。

int key = arr[0];
int tempCount = 0;
int realCount = 0;
for(int i = 1; i < arr.length; i++){
    if(arr[i] == key){
        tempCount++;
    }
    else{
        key = arr[i];
        tempCount = 0;
    }
    if(tempCount > realCount){
        realCount = tempCount;
    }
}
if(realCount >= 3){
    boolean hasThreeOfTheSame = true;
    //do stuff you want to do
}
编辑:我现在意识到OP需要一种方法来查找数组中是否有3个相同的元素,尽管顺序。我误读了这个,所以我的解决方案发现一个数组是否连续有3个或更多连续元素(例如:[1,1,1,2,3]或[1,2,2,2,3])。我只是为了保持这种状态,因为它可以帮助那些人。