包含另一个数组的数组

5

我有一个包含一些字符串的数组tab1,还有另一个数组,可能包含数组tab1中的所有元素。我该如何避免重复使用tab1中相同的元素:

String[] tab1 ={"AF","HB,"ER"} 
String[] tab2 ={"AF","HB,"ER","HO","NF","BB","CD","PO"}

我想说:tab2 = {tab1,"HO",...} 有什么想法吗?
谢谢。

+1 这是一个很好的问题。但是我想说你可以直接问如何找到数组中所有元素都是唯一的方式。https://dev59.com/eXNA5IYBdhLWcg3wAI3d - amod
8个回答

1
如何避免重复tab1中的相同元素?
您可以使用List,例如,对于“AF”,这里将只有一个对象和两个引用。
List<String> a = new ArrayList<String>;
List<String> b = new ArrayList<String>; 
b.addAll(a);
b.add("HO");

在这种情况下,我该如何声明我的元素? - lola
如果你在问如何在代码中声明,那么我已经在回答中提供了示例代码,不明白你的意思。 - jmj

1

你可能想使用 Arrays.copyOf() 来创建一个大小为 tab1.length + 5 的数组,它以 tab1 的元素开头,然后再[手动]添加 tab2 的元素。

简单示例:

    String[] tab1 ={"AF","HB","ER"};
    String[] tab2 = Arrays.copyOf(tab1, tab1.length+5);
    tab2[3] = "HO";
    tab2[4] = "NF";
    tab2[5] = "BB";
    tab2[6] = "CD";
    tab2[7] = "PO";
    System.out.println(Arrays.toString(tab2));

[当然,如果您有第三个数组中的后续元素,您可以迭代并将它们添加]


0
使用 Apache Commons Lang 库来连接数组。
String[] tab1 ={"AF","HB,"ER"} 
String[] tab2 ={"HO","NF","BB","CD","PO"}

String[] concat = (String[]) ArrayUtils.addAll(tab1, tab2);

1
你导入了那个 Apache Commons Lang 库吗? - Kevin Bowersox
Eclipse没有为我推荐这个库。 - lola

0
Arrays.asList(...).contains(...) 

如果您不想使用连接,这是您可以使用的最佳解决方案。 但我仍然觉得kmb35的方法是最好的

    String[] tab1 ={"AF","HB,"ER"}    
    String[] tab2 ={"AF","HB,"ER","HO","NF","BB","CD","PO"}
    String[] concat = (String[]) ArrayUtils.addAll(tab1, tab2);   

不要忘记使用Apache库。 您也可以选择tab2。
    private static final Set<String> tab2 = new HashSet<String>(Arrays.asList(
        new String[] {...//tab1 elements//...)); 

0
public class TestBoth {

    public static String[] join(String[]... params) {
        // calculate size of target array
        int size = 0;
        for (String[] array : params) {
            size += array.length;
        }

        String[] result = new String[size];

        int j = 0;
        for (String[] array : params) {
            for (String s : array) {
                result[j++] = s;
            }
        }
        return result;
    }

    public static void main(String[] args) {

        String[] tab1 = {"AF","HB", "ER"};

        String[] mtab = {"HO","NF","BB","CD","PO"};

        String[] tab2 = (String[]) join(tab1, mtab);

        System.out.println(java.util.Arrays.toString(tab2));
        /*
         * output : [AF, HB, ER, HO, NF, BB, CD, PO]
         */
    }
}

一个建议:不要将泛型与数组结合使用。应用程序可能会在未来出现问题。 - finbrein

0

我可能会按照Jigar Joshi建议的方法来做,就像这样:

import java.util.Arrays;
import java.util.ArrayList;

class Test {
    public static void main(String[] args) {
        ArrayList<String> tab1 = new ArrayList<String>(Arrays.asList("AF", "HB", "ER"));

        ArrayList<String> tab2 = new ArrayList<String>(tab1) {{
            addAll(Arrays.asList("HO", "NF", "BB", "CD", "PO"));
        }};
    }
}

语法有点奇怪,我知道。也许有些人不喜欢它,但是它很紧凑,所以我喜欢。


0
创建一个TreeSet(有序集合),然后将其分配给数组。
TreeSet<String> tabSet = new TreeSet<String>();
tabSet.add("e1");
// rest of tab1 elements

String [] tab1 = Collections.toArray(tabSet);

tabSet.add("e2"); 
// add missing tab2 elements

String [] tab2 = Collections.toArray(tabSet);

0

很抱歉,在Java中这是不可能的。

但是,您可以使用一个ArrayList容器,它具有从数组复制所有内容的构造函数。作为奖励,如果您添加更多元素,ArrayList会自动调整大小,而数组则不会。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接