Intro

前几天突然接到一个用Java复现Python代码的活,把我这个Java零基础的人折磨得要命。借此契机入门Java的同时也先记一下某一些特定的tips,方便以后查阅吧。

四舍五入

1
2
int start = (int)Math.round(Float.parseFloat(start_video_locations.get(index2).toString()))
//start_video_locations为Object类型的变量

List的去重

1
List course_ids = (List) course_ids_col.stream().distinct().collect(Collectors.toList());

List的排序

1
Collections.sort(list_name);

获取list长度

1
int list_length = list.size();

object类型的小数转成double

1
2
double score = Double.valueOf(String.valueOf(ques_df.row(0).get(3)));
//这里ques_df.row(0).get(3)是一个Object类型的小数

object类型字符串转成string

1
2
String viewed_video_id =(String) viewed_video_ids.get(count);
//viewed_video_ids.get(count)这里拿到的是一个object类型的字符串

double类型转成string

1
double pass = String.valueOf(pass_total);

double数据强制转成int

1
2
int i = new Double(video_lengths.get(0).toString()).intValue();
//video_lengths.get(0)是object类型的小数

for循环遍历列表List

1
for(Object course_index:course_indexs){}

用Python的话是下面这个:

1
for course_index in course_indexs

获取变量类型

1
System.out.println(object_name.getClass().getTypeName())

判断两个字符串是否相等

1
2
string1.equals(string2);
//相等返回true,否则返回false

对一个List获取某个指定索引的元素值

1
2
list.get(10);
//这里获取了下标为10的值,即数组概念中的list[10],可换成其他int型数字

两个int类型的变量相除获得一个double型的结果

1
double avg_rep_d = Double.valueOf(total_rep)/Double.valueOf(viewed_video_number);

double型小数保留n位后转成string格式保存

1
2
String avg_rep = String.format("%.2f", avg_rep_d);
//这里保留了2位小数,2可以换成任意位数

一个方法(函数)里传回多个返回值的笨方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private static List get_per_vtotal_vcompl(DataFrame df){
//………………略………………
String per_vtotal = String.format("%.4f", per_vtotal_d);
String per_vcompl = String.format("%.4f", per_vcompl_d);
List vtotal_vcompl_list = Arrays.asList(per_vtotal,per_vcompl);
return vtotal_vcompl_list;
}

//然后主方法里调用这个方法:
List vtotal_vcompl_list = get_per_vtotal_vcompl(df);
//获得list中第一个返回值
String per_vtotal = vtotal_vcompl_list.get(0).toString();
//获得list中第二个返回值
String per_vcompl = vtotal_vcompl_list.get(1).toString();

Date类型数据两种样式与String的两两转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Object转String
String end_time = end_localtimes.get(index1).toString();
String start_time = start_localtimes.get(index2).toString();
//构建日期样式
SimpleDateFormat usual_format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat green_format = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy",Locale.US);
//String转格林时间样式的Date
Date end_time_green = green_format.parse(end_time);
Date start_time_green = green_format.parse(start_time);
//格林时间样式的Date变量录入的同时转成普通时间格式的String
String end_time_str = usual_format.format(end_time_green);
String start_time_str = usual_format.format(start_time_green);
//String转Date
Date end_time_usual = usual_format.parse(end_time_str);
Date start_time_usual = usual_format.parse(start_time_str);
//.getTime()用于比较时间先后
if(end_time_usual.getTime() < start_time_usual.getTime()){
video_pause = video_pause + 1;
}

类似于Python中pandas的DataFrame的一个包

1
import joinery.DataFrame;

官方文档

把某一列类型强制转换

1
video_df = video_df.convert(String.class);//这里转换的第一列,后面要转换某一列的话其他列的实参要填上null,表示置之不顾

按某个值筛选部分数据

1
2
3
4
5
6
DataFrame course_df = video_df.select(new DataFrame.Predicate<Object>() {
@Override
public Boolean apply(final List<Object> row) {
return course_id.equals(row.get(1));
}
});

这里用Python的话是下面的一句话:

1
course_df = video_df[video_df['course_id']==course_id]

佛了。

获取整个df的长度(行数)

1
int length = df.length();

获取df各列的数据类型

1
System.out.println(df.types());

获取某一列的所有值组成一个ObjectList并强制转换成StringList

1
List<String> question_ids = (List<String>)(List)course_df.col("question_id");

获取某一行数据,组成一个list

1
2
List row = df.row(index);
//index为某一行的行数

After

就这样入坑Java,还氪了《核心技术》和《Haed First》这两本书,希望不会半途而废吧。这个杂七杂八的tips以后可能未完待续。