Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找向量列表中有多少唯一值-Java_Java - Fatal编程技术网

查找向量列表中有多少唯一值-Java

查找向量列表中有多少唯一值-Java,java,Java,我必须编写代码来解析子列表,并返回每个子列表中有多少唯一值,我编写了以下代码: public static Map<Integer,Set<String>> findAllFrequencies(List<List<String>> data){ // main key is the column index Map<Integer,Set<String>> frequency = new HashMap

我必须编写代码来解析子列表,并返回每个子列表中有多少唯一值,我编写了以下代码:

public static  Map<Integer,Set<String>>  findAllFrequencies(List<List<String>> data){
    // main key is the column index
    Map<Integer,Set<String>> frequency = new HashMap<>();
    for (Integer i = 0; i < data.size(); i++) {
        List<String> line = data.get(i);
        for (String cell : line) {
            frequency.putIfAbsent(i, Sets.newHashSet(cell));
            frequency.computeIfPresent(i, (k, v) -> {
                v.add(cell);
                return v;
            });
        }
    }
    return frequency;
}
公共静态映射findallf频率(列表数据){
//主键是列索引
映射频率=新HashMap();
对于(整数i=0;i{
v、 添加(单元格);
返回v;
});
}
}
返回频率;
}
假设我的输入是一个文件而不是列表,有更好的解决方案吗


方法是获取一个文件并解析每列,然后找到每列的唯一值。

您有几种方法可以知道字符串列表中的字符串是否唯一

1) 惰性解决方案:使用流并计算每个字符串出现的映射:

    Map<String, Long> occurrences = strings.stream()
        .collect(Collectors.groupingBy(s -> s, Collectors.counting()));
Map引用=strings.stream()
.collect(Collectors.groupingBy(s->s,Collectors.counting());
然后,每个值为1的条目都是唯一的

2) 计算重复项并从原始列表中删除所有重复项:

Set<String> alreadySeen = new HashSet<>();
Set<String> duplicates = new HashSet<>();
for (String s : strings) {
    if(alreadySeen.contains(s)) {
        duplicates.add(s);
    }
    alreadySeen.add(s);
}
List<String> result = new ArrayList<>(strings) 
result.removeAll(duplicates);
Set-alreadySeen=new-HashSet();
Set duplicates=new HashSet();
用于(字符串s:字符串){
如果(alreadySeen.contains){
副本。添加;
}
添加;
}
列表结果=新的ArrayList(字符串)
结果:删除所有(重复项);
3) 如果不想创建中间集合,请对列表进行排序。每个不同于其前身和后续元素的元素都是唯一的(imho中最干净的元素):

Set uniques=new HashSet();
strings.sort(Comparator.naturalOrder());
对于(int i=0;i0?strings.get(i-1):null;
字符串继承者=i
我投票结束这个问题,因为要求我们审查“真实”工作代码的问题属于您可能想要的@SteveSmith:不,OP绝对不需要代码审查。这是相当不完整的代码。@GhostCat可以随意推荐CR上的OP帖子,但在将来,请不要以代码审查作为结束问题的理由。评估请求并使用一个理由,比如过于宽泛,主要是基于意见的,等等。然后你可以向OP提到,如果是,它可以发布在代码审查上。请参阅“在中不应执行的操作”部分
Set<String> uniques = new HashSet<>();
strings.sort(Comparator.naturalOrder());
for(int i = 0; i< strings.size(); i++) {
    String predecessor = i > 0 ? strings.get(i - 1) : null;
    String successor = i < strings.size() - 1 ? strings.get(i + 1) : null;
    String current = strings.get(i);
    if(!current.equals(predecessor) && !current.equals(successor)) {
        uniques.add(current);
    }
}