使方法通用于CharSequence []和Set <string>

时间:2015-07-21 09:57:09

标签: java android generic-programming

我正在尝试将char方法转换为CharSequence []和Set的泛型。好吧,我没有经验。

这是第二个参数/返回值应该是通用的(T)的方法。有可能吗?

private CharSequence[] remove(String string, CharSequence[] charSequences)
    {
        ArrayList<CharSequence> newArray = new ArrayList<CharSequence>();
        int foundPlace = -1;
        CharSequence[] v = charSequences;
        for (int i = 0; i < v.length; i++) {
            if (foundPlace != -1 && v[i].equals(string))
                foundPlace = i;
            else
                newArray.add(v[i]);
        }
        return newArray.toArray(new CharSequence[newArray.size()]);
    }

我尝试了什么。替换了T中出现CharSequence []的所有地方,但当我将T放入行T.length时它没有工作。

更多澄清(抱歉)。我想转换第二个参数并将值返回到T - 所以CharSequence []到T的所有地方。

5 个答案:

答案 0 :(得分:3)

也许这就是你想要的:

private <T> T[] remove(T string, T[] charSequences)
    {
        ArrayList<T> newArray = new ArrayList<T>();
        int foundPlace = -1;
        T[] v = charSequences;
        for (int i = 0; i < v.length; i++) {
            if (foundPlace != -1 && v[i].equals(string))
                foundPlace = i;
            else
                newArray.add(v[i]);
        }
        @SuppressWarnings("unchecked")
        T[] ret = (T[]) Array.newInstance(v.getClass().getComponentType(), newArray.size());
        return newArray.toArray(ret);
    }

或者,如果包含的类也应该是T类型的通用类,只需从上面删除<T>即可。所以这一行,

private <T> T[] remove(T string, T[] charSequences)

然后会变成,

private T[] remove(T string, T[] charSequences)

如果string的类型无关紧要,您可以将其类型更改为普通Object

private T[] remove(Object string, T[] charSequences)
    {
        ArrayList<T> newArray = new ArrayList<T>();
        int foundPlace = -1;
        T[] v = charSequences;
        for (int i = 0; i < v.length; i++) {
            if (foundPlace != -1 && v[i].equals(string))
                foundPlace = i;
            else
                newArray.add(v[i]);
        }
        ...
    }

您可能还想在之后将string重命名为其他内容。

我还应该注意,在您的逻辑中,foundPlace始终为-1

答案 1 :(得分:1)

  • 您使用<div class="row" ng-repeat="image in images" ng-if="$index % 3 === 0"> <div class="col col-33" ng-if="$index < images.length"> <img ng-src="{{images[$index].src}}" width="100%" /> </div> <div class="col col-33" ng-if="$index + 1 < images.length"> <img ng-src="{{images[$index + 1].src}}" width="100%" /> </div> <div class="col col-33" ng-if="$index + 2 < images.length"> <img ng-src="{{images[$index + 2].src}}" width="100%" /> </div> </div> 的整数,但是布尔值就足够了,因为您只是测试它是否已经初始化并且从不使用它的值。
  • 您甚至不需要此布尔值,并且永远不会评估您的foundPlace测试,因为equals始终等于-1(因此您返回的数组始终是{{ 1}})
  • 您不需要中间变量foundPlace,只需迭代charSequences

这是一个带有Object的版本,如果你正在寻找它:

v

答案 2 :(得分:0)

泛型和数组可能是一个非常痛苦的组合。我会坚持使用List接口,如果这是你的选项(即将返回类型更改为List并简单地返回newArray,它也是List类型)。

否则我建议这篇文章更好地理解泛型和数组: How to create a generic array in Java?

编辑:哦,你肯定不想用“T”代替“CharSequence []”,但如果你真的需要在这里使用数组,那么可能用“T []”代替。

答案 3 :(得分:0)

要实现通用集合,请使用:

int length; // ...
T[] array = (T[])new Object[length];

因此,return语句将如下所示:

return (T[])newArray.toArray(new Object[newArray.size()]);

答案 4 :(得分:0)

以下是如何实现删除例程的方法。请注意,您甚至不需要单独的删除方法。我希望,我不会错过一个需要您创建单独的删除方法的用例。

package com.anupam;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class SO31535852 {
  public static void main(String args[]) {
    String[] arr = {"1", "2", "3"};

    // Create a copy of the orginal array if you do not want to modify it.
    Set<String> test = new HashSet<>(Arrays.asList(Arrays.copyOf(arr, arr.length)));

    // In fact you do not even need a remove method. I could not understand why you are using
    // foundPlace variable it's not doing much.
    System.out.println(remove("1", test));
    System.out.println(remove("1", test));
  }

  /**
   * Removes a specific value from the underling collection
   *
   * @param toRemove the object to be removed
   * @param myCollection the colelction from which to be removed
   * @return the removed value or null.
   */
  private static <T> T remove(T toRemove, Set<T> myCollection) {
    return myCollection.remove(toRemove) ? toRemove : null;
  }
}