我正在尝试将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的所有地方。
答案 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;
}
}