【问题标题】:Array of unique numbers唯一数字数组
【发布时间】:2017-03-24 15:43:13
【问题描述】:

我正在尝试编写一个返回唯一数字数组的函数。数组必须排序。当有多个元素时,该函数可以正常工作,但当数组中只有一个元素时,该函数不起作用。该函数应该返回在该数组中找到的唯一元素,但它返回的是一个空数组。

为什么会这样?

数组必须为 numUnique 和 removeDuplicates 排序

    public static int numUnique (double[] list){
    int uniques = 1;
    int i = 1;
    if(list.length == 0) return 0;
    while(i<list.length){
        if(list[i] != list[i - 1])
            uniques++;
        i++;
    }
    return uniques;
}

    public static double[] removeDuplicates(double[] list){
    double[] arrayOfUniques = new double[numUnique(list)];
    if(list.length == 0) return arrayOfUniques; 

    int uniques = 1;
    int i = 1;
    arrayOfUniques[0] = list[0];
    while(i < list.length){
        if(list[i] != list[i - 1])
            arrayOfUniques[uniques++] = list[i];
        i++;
    }
    return arrayOfUniques;
}

数组:

double[] a = {11,11,21,31,41,41,51,61,61,61,71,71,81,91,91,100,100};

输出:

唯一数字:9

唯一数组: [11.0、21.0、31.0、41.0、51.0、61.0、71.0、81.0、91.0]

但是当数组只有一个元素时它不起作用:

 double[] a = {11};

输出:

唯一数字:0

唯一数组:[]

【问题讨论】:

  • 你有没有试过设置一些断点,看看当你传递一个元素的数组时发生了什么?
  • i == 0(因为这是第一次通过该循环)和list.length == 1 时,您希望while(i &lt; list.length-1) 做什么?
  • 为什么不使用 Set 或 List 呢? stackoverflow.com/questions/3064423/…
  • 谢谢。我看到了错误。
  • 请考虑接受答案或投票,这就是论坛的运作方式,新人会更容易看到接受的帖子而不是不接受的帖子

标签: java arrays loops


【解决方案1】:

试试这个.. 将您的数组转换为列表并将列表转换为集合

设置没有重复值..简单

List<String> myList= Arrays.asList(a);//convert array to List
Set<Double> uniqueSet = new HashSet<Double>(myList);//you get unique values

如果你想设置为数组试试这个https://stackoverflow.com/a/5982478/3879847

【讨论】:

    【解决方案2】:
    public List<Double> removeDuplicates (List<Double> list){
            // add elements to al, including duplicates
            Set<Double> hs = new HashSet<Double>();
            hs.addAll(list);
            list.clear();
            list.addAll(hs);
            return list;
        }
    

    【讨论】:

    • return new ArrayList&lt;&gt;(new HashSet&lt;&gt;(list)); ;)
    【解决方案3】:

    实际上,它也不适用于只有一个唯一元素的数组(例如,它为 new double[]{11.0,11.0, 11.0} 返回空数组)。我会推荐使用 Java 8 的stream 更简单的方法:

    public static double[] removeDuplicates(double[] list){
        LinkedHashSet<Double> uniqueElements = Arrays.stream(list)
        .boxed()
        .collect(Collectors.toCollection(LinkedHashSet::new));
        return uniqueElements.stream().mapToDouble(d -> d).toArray();
    }
    

    【讨论】:

      【解决方案4】:

      在 Java 8 中,我们得到了 Stream,那么在这种情况下如何使用它:

      public static void main (String[] args) {
          double[] a = {11,11,21,31,41,41,51,61,61,61,71,71,81,91,91,100,100};
          //Way 1 just to print the unique element
          DoubleStream.of(removeDuplicate(a)).forEach(System.out::println);
          //Way 2 to save the update the array with only the unique element
          a = removeDuplicate(a);
      }
      
      private static double[] removeDuplicate(double[] a) {
          return DoubleStream.of(a).distinct().sorted().toArray();
      } 
      

      在main中,我们只是调用方法,然后读取结果并打印值

      removeDuplicate 方法中:我们创建值的流,然后只保留不同的元素,然后对它们进行排序,然后我们将它们返回到一个数组中(按照您的意愿)

      如果你不确定一定要使用数组,最好每次都使用 List ;)

      【讨论】:

        猜你喜欢
        • 2014-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多