diff --git a/native/jni/src/utils/int_array_view.h b/native/jni/src/utils/int_array_view.h
index 8797b594470f4c533fd2dbffc784b4e3eddf4741..c9c3b21d4f827dde6ff5ea556791ae06ac1c3483 100644
--- a/native/jni/src/utils/int_array_view.h
+++ b/native/jni/src/utils/int_array_view.h
@@ -96,6 +96,13 @@ class IntArrayView {
         return IntArrayView(mPtr, std::min(maxSize, mSize));
     }
 
+    const IntArrayView skip(const size_t n) const {
+        if (mSize <= n) {
+            return IntArrayView();
+        }
+        return IntArrayView(mPtr + n, mSize - n);
+    }
+
  private:
     DISALLOW_ASSIGNMENT_OPERATOR(IntArrayView);
 
diff --git a/native/jni/tests/utils/int_array_view_test.cpp b/native/jni/tests/utils/int_array_view_test.cpp
index ecc451af0aa41e361dabdc02eff0bdc60d5b5dd7..161df2f43df6a025194bbac8a69275e1d756dc59 100644
--- a/native/jni/tests/utils/int_array_view_test.cpp
+++ b/native/jni/tests/utils/int_array_view_test.cpp
@@ -72,5 +72,22 @@ TEST(IntArrayViewTest, TestLimit) {
     }
 }
 
+TEST(IntArrayViewTest, TestSkip) {
+    const std::vector<int> intVector = {3, 2, 1, 0, -1, -2};
+    IntArrayView intArrayView(intVector);
+
+    EXPECT_TRUE(intArrayView.skip(intVector.size()).empty());
+    EXPECT_TRUE(intArrayView.skip(intVector.size() + 1).empty());
+    EXPECT_EQ(intArrayView.size(), intArrayView.skip(0).size());
+    EXPECT_EQ(intArrayView.size(), intArrayView.limit(1000).size());
+
+    static const size_t SKIP_COUNT = 2;
+    IntArrayView subView = intArrayView.skip(SKIP_COUNT);
+    EXPECT_EQ(intVector.size() - SKIP_COUNT, subView.size());
+    for (size_t i = 0; i < subView.size(); ++i) {
+        EXPECT_EQ(intVector[i + SKIP_COUNT], subView[i]);
+    }
+}
+
 }  // namespace
 }  // namespace latinime