将long列表转换为String set

时间:2018-08-30 09:38:48

标签: java

让我们说,无论出于何种原因,我都必须将List<Long>转换为Set<String>。为了不丢失列表中的任何项目,我必须根据项目创建唯一的String。目前,我正在这样做:

public class StringUtils {
    private static final String FORMAT = "<%d>:%s";
    private static long counter = 0;

    public static synchronized String valueOf(long value) {
        return String.format(FORMAT, counter++, String.valueOf(value));
    }

    public static long getLong(String input) {
        int start = input.indexOf(":") + 1;
        int end = input.length();

        return Long.parseLong(input.substring(start, end));
    }
}

for(long item : list) {
   set.add(StringUtils.valueOf(item));
}

我认为这不是一个很好的解决方案,但至少可以奏效。您能想到更好/更快的方法吗?顺便说一句。我仅限于Java 7。

2 个答案:

答案 0 :(得分:2)

要访问List索引,请不要使用增强型for,而要使用经典的for

private static final String FORMAT = "<%d>:%s";

// ...

for(int i=0; i< list.size(); i++) {
   long item = list.get(i);
   set.add(String.format(FORMAT, i, String.valueOf(item)));
}

请注意,您不会丢失Set​​中重复元素的方法是可行的:包含两个不同信息的String没有意义。
您可以使用不覆盖equals()/hashCode()的自定义类,这样就不会丢失任何元素:

Set<MyValue> set = ...;

for(long item : list) {
   set.add(new MyValue(item)));
}

MyValue定义为

public class MyValue{

  private long value; 

  public MyValue(long value){
    this.value = value;
  }

  public long getValue(){ 
     return value;
  }
}

答案 1 :(得分:1)

我能想到ListIterator为您提供索引。

    for (ListIterator<Long> iter = list.listIterator(); iter.hasNext(); ) {
        int  i = iter.nextIndex();
        long l = iter.next();
        set.add(String.format(FORMAT, i, String.valueOf(l)));
    }

Try it online!